【问题标题】:Dynamic filenames动态文件名
【发布时间】:2010-08-14 17:19:37
【问题描述】:

所以我正在开发一个程序,将数据存储到多个 .txt 文件中。我要使用的命名约定是文件“xx”,其中 X 是数字,所以 file00、file01、...一直到 file20,我希望分配给它们的变量是 fxx(f00、f01、. ..)。

如何在 Python 中使用 for 循环(或另一种方法)访问这些文件,这样我就不必输入 open("fileXX") 21 次?

【问题讨论】:

    标签: python filenames


    【解决方案1】:

    名称是常规的。您可以使用简单的列表理解创建文件名列表。

    ["f%02d"%x for x in range(1,21)]
    

    【讨论】:

    【解决方案2】:

    t写入所有文件的示例:

    for x in range(22): #Remember that the range function returns integers up to 22-1
        exec "f%02d = open('file%02d.txt', 'w')" % (x, x)
    

    我使用exec 语句,但可能有更好的方法。我希望你明白这一点。

    注意:此方法将为您提供变量名称fXX,以便以后在需要时使用。最后两行只是示例。如果您只需要将fileXX.txt 分配给fXX,则不需要。

    编辑:删除了最后两行,因为人们似乎对我把它们放在那里不太满意。 反对票的解释总是很好。

    【讨论】:

    • 你为什么要使用exec?您可以重复使用存储文件句柄的变量,因此无需使用不同名称的变量 - 您需要做的唯一插值是在文件名中:f = open('file%02d.txt' % x, 'w')
    • 因为 OP 稍后可能需要该格式的变量,正如他所说:“我希望分配给它们的变量是 fxx (f00,f01...)” .仅使用f = 将不允许他拥有这些变量名。 exec 允许他拥有他需要的变量名
    • 好吧,我说可能有比使用exec 更好的方法,但这种方法确实可以让他拥有他想要的东西,不是吗?
    • 嗯,是的,你是对的,因为它有效,但错误的是 exec 不是这里的正确工具。顺便说一句,我没有给你投反对票。
    • 别担心,我可以告诉你没有:P。
    【解决方案3】:

    查看 python 的glob module

    它使用通常的 shell 通配符语法,所以?? 可以匹配任意两个字符,而* 可以匹配任何字符。您可以使用f??.txtf*.txt,但前者是更严格的匹配,不会匹配fact_or_fiction.txt 之类的东西,而后者会。

    例如:

    import glob
    for filename in glob.iglob('f??.txt'):
        infile = file(filename)
        # Do stuff...
    

    【讨论】:

    • glob 是一个不错的选择。但是,如果您只想访问某个集合(例如,存在 f0-99,但您只需要 f0-19),那么您可以使用字符串插值:"f%02d" % 4 变为 "f04"
    • +1 到 Amber。只有当我想要所有文件都匹配一个模式时,我才会使用 glob。对于名称先验已知的一系列文件,我将生成名称。
    • 如果需要插值参考:docs.python.org/library/…
    • @Amber - 是的,值得注意的是 glob 不一定会按排序顺序返回内容(这取决于底层文件系统)。
    • 此外,glob 只会返回现有匹配文件,如果你想像原始发布者那样创建它们,这对你没有帮助(而且它们以前不存在)
    【解决方案4】:

    我认为关键是 OP 想要以编程方式注册变量:

    for i in range( 20 ):
        locals()[ "f%02d" % i ] = open( "file%02d.txt" % i )
    

    然后例如

    print( f01 )
    ...
    

    【讨论】:

    • @vlad003 - docs.python.org/tutorial/… 此外,查找全局变量比查找局部变量要慢,因此除了通常避免全局变量之外,还有速度差异。
    • @vlad003:我从来没有说过它比globals()好(它相当于vars()没有参数),我说它比exec好。然而,Joe 是对的,它 更好。
    • 任何东西都可能比exec好;我只把它放在这里 b/c 它工作,即使不是最好的。 @Joe:感谢您的链接。我从来没有读过教程。我通常边做边学,边做边学。
    • 这可行,但我不喜欢在我的命名空间中神奇地创建变量的想法。我更希望将这些名称放入字典或类似的东西中。
    【解决方案5】:
    files = [open("file%02d", "w") for x in xrange(0, 20+1)]
    # now use files[0] to files[20], or loop
    
    # example: write number to each file
    for n, f in enumerate(files):
      files.write("%d\n" % n)
    
    # reopen for next example
    files = [open("file%02d", "r") for x in xrange(0, 20+1)]
    # example: print first line of each file
    for n, f in enumerate(files):
      print "%d: %s" % (n, f.readline())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 2017-07-20
      • 2010-10-04
      • 2011-05-14
      • 2017-03-25
      • 1970-01-01
      相关资源
      最近更新 更多