Python 在链接文件句柄上迭代

Python 在链接文件句柄上迭代,python,Python,我有一个打开(用于读取)文件句柄的列表。我希望使用单个循环来迭代每个文件的每一行,而不是创建一个外部循环来迭代文件句柄列表,并创建一个嵌套的内部循环来迭代这些行。看起来,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.

我有一个打开(用于读取)文件句柄的列表。我希望使用单个循环来迭代每个文件的每一行,而不是创建一个外部循环来迭代文件句柄列表,并创建一个嵌套的内部循环来迭代这些行。看起来,
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>
$python
Python 2.7.10(默认值,2015年5月26日,13:08:10)
[GCC 4.2.1达尔文兼容苹果LLVM 6.0(clang-600.0.57)]
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>fh1=打开('file1','r')
>>>fh2=打开('file2','r')
>>>进口itertools
>>>输入=itertools.chain([fh1,fh2])
>>>对于行输入:
...     打印行
... 

itertools.chain将链接您传递给它的iterable对象,在本例中,您只传递了一个列表(
[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]

不要将参数包装在列表中。直接传过去

input = itertools.chain(fh1, fh2)
如果您已经有一个列表,您可以使用其中一个:

files = [...]

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

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