迭代多个生成器(文件句柄)
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', '', '']]
一次从多个文件中读取一行的最佳方法是什么(遍历多个生成器)。
我的尝试:
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', '', '']]