一次从多个文件中读取一行的最佳方法是什么(迭代多个生成器)。
我的尝试:
files = ['a.dat', 'b.dat', 'c.dat']
fHandles = [open(file, 'r') for file in files]
for line in zip(*fHandles):
print line[0]
print line[1]
print line[2]
有更好的方法吗?
(我觉得zip(*fHandles)
有点好笑......)
答案 0 :(得分:4)
zip
会热切地阅读所有文件的全部内容,因此内存效率不高。鉴于每个文件的行数也可能不同,如果您想同时迭代这些行,我建议您使用itertools.izip_longest
。
import itertools
files = ['a.dat', 'b.dat', 'c.dat']
handles = [open(file, 'r') for file in files]
for a, b, c in itertools.izip_longest(*handles, fillvalue=''):
print a
print b
print c
另外,完成后不要忘记关闭文件。
for handle in handles:
handle.close()
答案 1 :(得分:2)
不完全确定如何量化最佳,但这应该逐行阅读并对结果进行分组。
# Files to load
files = ['a.dat', 'b.dat', 'c.dat']
# Number of lines to read from each
lines = 3
# Open the files
fhs = [open(f) for f in files]
# Read x number of lines from each
print([map(lambda f: f.readline(), fhs) for x in range(lines)])
# Close the handles
[fh.close() for fh in fhs]
制作人:
[['line1', 'line1', 'line1'], ['line2', 'line2', 'line2'], ['line3', 'line3', 'line3']]
如果他们有不等的行(比如b和c只有2行,但是有3行),它会产生:
[['line1', 'line1', 'line1'], ['line2', 'line2', 'line2'], ['line3', '', '']]