【问题标题】:Iterate across lines in two files in sequence依次遍历两个文件中的行
【发布时间】:2012-07-22 11:53:53
【问题描述】:

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

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

【问题讨论】:

    标签: python


    【解决方案1】:

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

    import itertools
    
    for line in itertools.chain(open(file_name1), open(file_name2)):
        # do something
    

    【讨论】:

    • 虽然您的解决方案可以完成这项工作,但我选择fileinput 解决方案,因为它会在读取文件后关闭文件。无论如何,谢谢。
    【解决方案2】:

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

    【讨论】:

    • 这些解决方案仍将涉及循环,我认为这更多的是评论而不是答案。
    【解决方案3】:

    不完全符合您的要求,但 fileinput 模块可能有用。

    """帮助类快速编写所有标准输入文件的循环。 典型用途是: 导入文件输入 对于 fileinput.input() 中的行: 流程(线) 这会遍历 sys.argv[1:] 中列出的所有文件的行, 如果列表为空,则默认为 sys.stdin。如果文件名是 '-' 它 也被 sys.stdin 取代。指定一个替代列表 文件名,将其作为参数传递给 input()。单个文件名是 也允许。 函数 filename(), lineno() 返回文件名和累积行 刚刚读取的行号; filelineno() 返回其 当前文件中的行号; isfirstline() 返回真当且仅当 刚刚读取的行是其文件的第一行; isstdin() 返回真 如果该行是从 sys.stdin 中读取的。函数 nextfile() 关闭 当前文件,以便下一次迭代将读取第一行 下一个文件(如果有);未从文件中读取的行将不计入 朝向累积行数;文件名直到 在读取下一个文件的第一行之后。函数关闭() 关闭序列。 ...

    【讨论】:

      【解决方案4】:

      正如已经指出的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
      

      【讨论】:

      • +1 我更喜欢这个,因为itertools 解决方案会使关闭文件不方便。
      • 如果程序突然结束,我下次运行它时会得到一个RuntimeError: input() already active。有没有办法解决这个问题。
      • @JonClements 是的,我目前正在这样做。有没有办法在代码中实现这一点,以便每当它破坏文件时都会关闭。谢谢。
      【解决方案5】:

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

      >>> 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
      

      【讨论】:

      • -1 不是问题。还有zip(*args) > map(None, *args)。不需要readlinesfile 对象是文件行的迭代器,因此您可以简单地执行以下操作:zip(file1, file2)
      猜你喜欢
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      相关资源
      最近更新 更多