3

我有两个文件,我想对它们执行一些逐行操作(一个接一个)。我现在使用两个循环来实现这一点。有没有办法在一个循环中做到这一点(在 python 2.7 中):

for fileName in [fileNam1,fileName2]:
    for line in open(fileName):
        do something
4

5 回答 5

7

正如已经指出的那样,itertools.chain这是一个选项,但是还有另一个有用的标准模块,它避免了显式使用open...

import fileinput
for line in fileinput.input(['file1.txt', 'file2.txt']):
    print line

这也有一些方便的功能,用于行号和文件名等...查看http://docs.python.org/library/fileinput.html上的文档

回复评论 - 与上下文管理器一起使用

from contextlib import closing

with closing(fileinput.input(['file1.txt', 'file2.txt'])) as infiles:
    for line in infiles:
        pass # stuff
于 2012-07-24T07:48:02.103 回答
4

itertools模块为此提供了一个工具。试试这个:

import itertools

for line in itertools.chain(open(file_name1), open(file_name2)):
    # do something
于 2012-07-24T07:40:43.023 回答
4

不完全是您所要求的,但 fileinput 模块可能很有用。

"""帮助类快速编写所有标准输入文件的循环。

典型用途是:

    导入文件输入
    对于 fileinput.input() 中的行:
        流程(线)

这会遍历 sys.argv[1:] 中列出的所有文件的行,
如果列表为空,则默认为 sys.stdin。如果文件名是 '-' 它
也被 sys.stdin 取代。指定一个替代列表
文件名,将其作为参数传递给 input()。单个文件名是
也允许。

函数 filename(), lineno() 返回文件名和累积行
刚刚读取的行号;filelineno() 返回其
当前文件中的行号;isfirstline() 返回真当且仅当
刚刚读取的行是其文件的第一行;isstdin() 返回真
如果该行是从 sys.stdin 中读取的。函数 nextfile() 关闭
当前文件,以便下一次迭代将读取第一行
下一个文件(如果有);未从文件中读取的行将不计入
朝向累积行数;文件名直到
在读取下一个文件的第一行之后。函数关闭()
关闭序列。
...
于 2012-07-24T07:46:34.623 回答
0

也许您可以使用列表理解或 map、reduce、filter 等来避免内部循环。这完全取决于您的需要。你想做什么?

于 2012-07-24T07:44:21.603 回答
0

这是我的第一个回答,如有错误请见谅

>>> 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
于 2012-07-24T08:05:59.720 回答