总有fileinput
。
for line in fileinput.input(filenames):
...
但是,阅读源代码似乎fileinput.FileInput
不能用作上下文管理器1。为了解决这个问题,可以使用实例,contextlib.closing
因为FileInput
实例具有合理实现的close
方法:
from contextlib import closing
with closing(fileinput.input(filenames)) as line_iter:
for line in line_iter:
...
使用上下文管理器的另一种方法是编写一个简单的函数,遍历文件并随行产生以下行:
def fileinput(files):
for f in files:
with open(f,'r') as fin:
for line in fin:
yield line
itertools.chain
这里不需要真正的恕我直言…这里的魔力在于yield
语句,该语句用于将普通函数转换为异常懒惰的生成器。
1顺便说一句,从python3.2开始,fileinput.FileInput
被 实现为上下文管理器,它执行与我们之前所做的完全一样的操作contextlib
。现在我们的示例变为:
# Python 3.2+ version
with fileinput.input(filenames) as line_iter:
for line in line_iter:
...