我有一个打开(用于阅读)文件句柄的列表。我想使用单个循环遍历每个文件的每一行,而不是创建一个外部循环来迭代文件句柄列表和一个嵌套的内部循环来迭代这些行。看起来itertools.chain()
正是为了这个目的而设计的,但我无法让它发挥作用。我做错了什么?
这是一个简单的例子来说明。
$ python
Python 2.7.10 (default, May 26 2015, 13:08:10)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> fh1 = open('file1', 'r')
>>> fh2 = open('file2', 'r')
>>> import itertools
>>> input = itertools.chain([fh1, fh2])
>>> for line in input:
... print line
...
<open file 'file1', mode 'r' at 0x10c2a6780>
<open file 'file2', mode 'r' at 0x10c2a64b0>
答案 0 :(得分:4)
不要将参数包装在列表中。直接传递它们。
input = itertools.chain(fh1, fh2)
如果您已有列表,可以使用以下方法之一:
files = [...]
input = itertools.chain(*files)
input = itertools.chain.from_iterable(files)
答案 1 :(得分:3)
itertools.chain
将链接您传递给它的可迭代对象,在这种情况下,您只传递一个列表([fh1, fh2]
),因此它将返回包含该列表的迭代器。
如果要链接文件对象,则需要将它们传递到列表外部或解压缩列表:
input = itertools.chain(fh1, fh2)
或者:
input = itertools.chain(*[fh1, fh2])
演示:
>>> list(chain(range(5),range(2),range(3)))
[0, 1, 2, 3, 4, 0, 1, 0, 1, 2]