【发布时间】:2010-08-14 17:19:37
【问题描述】:
所以我正在开发一个程序,将数据存储到多个 .txt 文件中。我要使用的命名约定是文件“xx”,其中 X 是数字,所以 file00、file01、...一直到 file20,我希望分配给它们的变量是 fxx(f00、f01、. ..)。
如何在 Python 中使用 for 循环(或另一种方法)访问这些文件,这样我就不必输入 open("fileXX") 21 次?
【问题讨论】:
所以我正在开发一个程序,将数据存储到多个 .txt 文件中。我要使用的命名约定是文件“xx”,其中 X 是数字,所以 file00、file01、...一直到 file20,我希望分配给它们的变量是 fxx(f00、f01、. ..)。
如何在 Python 中使用 for 循环(或另一种方法)访问这些文件,这样我就不必输入 open("fileXX") 21 次?
【问题讨论】:
名称是常规的。您可以使用简单的列表理解创建文件名列表。
["f%02d"%x for x in range(1,21)]
【讨论】:
将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')。
f = 将不允许他拥有这些变量名。 exec 允许他拥有他需要的变量名
exec 更好的方法,但这种方法确实可以让他拥有他想要的东西,不是吗?
exec 不是这里的正确工具。顺便说一句,我没有给你投反对票。
查看 python 的glob module。
它使用通常的 shell 通配符语法,所以?? 可以匹配任意两个字符,而* 可以匹配任何字符。您可以使用f??.txt 或f*.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"。
我认为关键是 OP 想要以编程方式注册变量:
for i in range( 20 ):
locals()[ "f%02d" % i ] = open( "file%02d.txt" % i )
然后例如
print( f01 )
...
【讨论】:
globals()好(它相当于vars()没有参数),我说它比exec好。然而,Joe 是对的,它 更好。
exec好;我只把它放在这里 b/c 它工作,即使不是最好的。 @Joe:感谢您的链接。我从来没有读过教程。我通常边做边学,边做边学。
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())
【讨论】: