【问题标题】:How to read lots of line from file at once如何一次从文件中读取大量行
【发布时间】:2017-06-23 23:13:12
【问题描述】:

我想根据模板生成一堆文件。该模板有数千行。对于每个新文件,只有前 5 行不同。一次读取除前 5 行之外的所有行而不是逐行读取整个文件的最佳方法是什么?

【问题讨论】:

  • 你的意思是:你想一个接一个地阅读前 5 行,然后是其余的?
  • @Jean-FrançoisFabre 是的
  • 我误解了这个问题对不起
  • 那是因为 500 百行在英语中不是很地道(在法语中也不是)。我将编辑问题。

标签: python file io


【解决方案1】:

一种方法是创建一个包含前 5 行的列表,然后在一个大缓冲区中读取其余的:

with open("input.txt") as f:
    first_lines = [f.readline() for _ in range(5)]
    rest_of_lines = f.read()

第一部分更对称:用 5 行创建 1 个小缓冲区:

first_lines = "".join([f.readline() for _ in range(5)])

作为替代方案,从纯粹的 I/O 角度来看,最快的是

with open("input.txt") as f:
    lines = f.read()

并使用行拆分生成器读取前 5 行(splitlines() 在内存复制方面将是灾难性的,请找到实现 here

【讨论】:

  • 这实际上总体上做了很多吗?根据我从阅读中拼凑起来的内容,所以我肯定是错的,read() 无论如何都会缓冲行,所以为了 5 行而一次性将文件写入read 可能会更快?
  • 也许 I/O 会更快,但之后你必须将内容分成前 5 行,其余的:会使所需的内存加倍。
  • 有意思,没想到这么多。
【解决方案2】:

python 中的文件对象非常方便地是它们自己的迭代器对象,因此当您调用for line in f: ... 时,您可以逐行获取文件。文件对象有一个通常被称为光标的东西,它可以跟踪您正在读取的位置。当您使用通用 for 循环时,此光标每次都会前进到下一个换行符并返回它读取的内容。如果你在文件结束之前中断这个循环,你可以用另一个循环从你离开的地方重新开始,或者只是调用f.read()来读取文件的其余部分

with open(inputfile, 'r') as f:
    lineN = 0
    header = ""
    for line in f:
        header = header + line
        lineN += 1
        if lineN >= 4: #read first 5 lines (0 indexed)
            break
    body = f.read() #read the rest of the file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 2020-10-24
    • 2017-06-15
    • 2016-05-09
    相关资源
    最近更新 更多