【发布时间】:2012-07-22 11:53:53
【问题描述】:
我有两个文件,我想对它们执行一些逐行操作(一个接一个)。我现在使用两个循环来实现这一点。有没有办法在一个循环中做到这一点(在 python 2.7 中):
for fileName in [fileNam1,fileName2]:
for line in open(fileName):
do something
【问题讨论】:
标签: python
我有两个文件,我想对它们执行一些逐行操作(一个接一个)。我现在使用两个循环来实现这一点。有没有办法在一个循环中做到这一点(在 python 2.7 中):
for fileName in [fileNam1,fileName2]:
for line in open(fileName):
do something
【问题讨论】:
标签: python
itertools 模块为此提供了一个工具。试试这个:
import itertools
for line in itertools.chain(open(file_name1), open(file_name2)):
# do something
【讨论】:
fileinput 解决方案,因为它会在读取文件后关闭文件。无论如何,谢谢。
也许您可以使用列表理解或 map、reduce、filter 等来避免内部循环。这完全取决于您的需要。你想做什么?
【讨论】:
不完全符合您的要求,但 fileinput 模块可能有用。
"""帮助类快速编写所有标准输入文件的循环。 典型用途是: 导入文件输入 对于 fileinput.input() 中的行: 流程(线) 这会遍历 sys.argv[1:] 中列出的所有文件的行, 如果列表为空,则默认为 sys.stdin。如果文件名是 '-' 它 也被 sys.stdin 取代。指定一个替代列表 文件名,将其作为参数传递给 input()。单个文件名是 也允许。 函数 filename(), lineno() 返回文件名和累积行 刚刚读取的行号; filelineno() 返回其 当前文件中的行号; isfirstline() 返回真当且仅当 刚刚读取的行是其文件的第一行; isstdin() 返回真 如果该行是从 sys.stdin 中读取的。函数 nextfile() 关闭 当前文件,以便下一次迭代将读取第一行 下一个文件(如果有);未从文件中读取的行将不计入 朝向累积行数;文件名直到 在读取下一个文件的第一行之后。函数关闭() 关闭序列。 ...【讨论】:
正如已经指出的itertools.chain 是一个选项,但是还有另一个有用的标准模块可以避免必须显式使用open...
import fileinput
for line in fileinput.input(['file1.txt', 'file2.txt']):
print line
这也有一些方便的函数用于行号和文件名等...查看http://docs.python.org/library/fileinput.html的文档
回复 cmets - 与上下文管理器一起使用
from contextlib import closing
with closing(fileinput.input(['file1.txt', 'file2.txt'])) as infiles:
for line in infiles:
pass # stuff
【讨论】:
itertools 解决方案会使关闭文件不方便。
RuntimeError: input() already active。有没有办法解决这个问题。
这是我的第一个回答,如有错误请见谅
>>> file1 = open('H:\\file-1.txt')
>>> file2 = open('H:\\file-2.txt')
>>> for i, j in map(None, file1.readlines(), file2.readlines()):
print i,j
【讨论】:
zip(*args) > map(None, *args)。不需要readlines。 file 对象是文件行的迭代器,因此您可以简单地执行以下操作:zip(file1, file2)