遍历链接文件句柄

3
我有一个打开的(可读取)文件句柄列表。我想使用单个循环迭代每个文件的每一行,而不是创建一个外部循环来迭代文件句柄列表和一个嵌套的内部循环来迭代每一行。看起来 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>
2个回答

4
不要将参数包含在列表中,而是直接传递它们。
input = itertools.chain(fh1, fh2)

如果您已经有一个列表,您可以使用以下其中之一:
files = [...]

input = itertools.chain(*files)
input = itertools.chain.from_iterable(files)

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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接