【问题标题】:Reading 1 line at a time from multiple files从多个文件一次读取 1 行
【发布时间】:2015-03-27 14:40:38
【问题描述】:

我有一堆文件名。我需要从每个文件中一次读取一行,进行一些处理,然后从每个文件中再次读取一行,进行一些处理等等。

我正在寻找有关如何以更 Pythonic 的方式执行此操作的建议。我知道每个文件中存在的行数,所以我现在对其进行硬编码,但我不想这样做。

更新: 这些文件都有相同的行数。

更新2: 至少有 30 个不同的文件。

filenames = []
line_count = 400
fileobjs = [open(i, 'r') for i in filenames]
for i in xrange(line_count):
    lines = []
    for each_fo in fileobjs:
        for each_line in each_fo:
            lines.append(each_line)
            break
    process(lines)

【问题讨论】:

  • 每个文件的行数都一样吗?
  • 是的,它们都有相同的行数。我会更新这个问题。谢谢。
  • 我认为使用file_obj.readlines 阅读所有内容可能会更干净。我还建议使用with 块来打开文件,因为它也处理关闭并且它被认为是pythonic。你有理由逐行阅读吗?
  • 是的,这是我需要的。行数可能非常非常大,所以我不希望将其全部读入内存。

标签: python file io


【解决方案1】:

这个怎么样?

from itertools import izip_longest
for file_lines in izip_longest(*map(open,filenames)):
    for line in file_lines:
        if line:
            # process line

【讨论】:

    【解决方案2】:
    lines = [next(fo) for fo in fileobjs]
    process(lines)
    

    【讨论】:

      【解决方案3】:

      这将一次一行地读取两个文件

       with open('File1','r') as FileA, open('File2','r') as FileB:
           for lineA,lineB in zip(FileA,FileB):
                print lineA,lineB
      

      【讨论】:

      • zip 对我来说听起来是个好主意,但是如果我们有两个以上的文件怎么办?如果我们有一个fileobjs 列表但我们不知道它有多大怎么办?
      【解决方案4】:
      filenames = []
      files = [open(f, mode='r') for f in filenames]
      for line in files[0]:
          lines = [file.readline() for file in files]
          process(lines)
      

      【讨论】:

        猜你喜欢
        • 2014-12-10
        • 2021-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-10
        • 1970-01-01
        • 1970-01-01
        • 2017-06-15
        相关资源
        最近更新 更多