迭代多个生成器(文件句柄)

Iterate over multiple generators (file handles)

一次从多个文件中读取一行的最佳方法是什么(遍历多个生成器)。

我的尝试:

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]

有更好的方法吗?

(感觉[=​​11=]有点搞笑...)

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()

不完全确定如何最好地量化,但这应该逐行阅读并对结果进行分组。

# 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 行,但 a 有 3 行),它会产生:

[['line1', 'line1', 'line1'], ['line2', 'line2', 'line2'], ['line3', '', '']]