【问题标题】:How to read a file from the last read position?如何从上次读取位置读取文件?
【发布时间】:2016-11-08 21:37:27
【问题描述】:

我有一个 3,000,000,000 行的文本文件。我用下面这个命令打开它

with open("/data/tmp/tbl_show_follow.txt") as infile:

但有时我需要终止我的 Python 脚本以停止读取此文件,而下一次我需要从上次读取的位置开始读取。我当前的解决方案是使用counter_i 来记住位置并每 100,000 行打印到日志

20161108 21:19  last position : 100000
20161108 22:34  last position : 200000
20161108 23:34  last position : 300000
.......
20161408 23:34  last position : 200000000

我再次运行 python 脚本,我需要像这样更改条件

count_i = 0 
with open("/data/tmp/tbl_show_follow.txt") as infile:
    for line in infile:
        if count_i > 300000:
            do sth ...

但是如果我的最后一个位置是 200,000,000 并且我停止了我的 Python 脚本,那么下次我需要从头读取文件并从 1 计数到 200,000,000。我认为这样做很愚蠢,如何从第 200,000,000 行开始?有什么方法可以记住我最后读取文件的位置吗?

【问题讨论】:

  • 只有知道最后读取的位置是bytes,而不是lines,才能跳转到文件中。
  • 对于一个包含这么多行的文件,可能值得将其分成多个文件,即 tbl_show_follow.1.txt、tbl_show_follow.2.txt 等等。如果您需要跟踪在杀死和运行脚本之间处理了多少行,您可以简单地在每 X 行的文件中写入从哪个文件开始。如果该文件不存在,您可以从头开始。我还建议使用生成器从文本中读取,以避免在内存中保存任何内容。

标签: python python-2.7 file


【解决方案1】:

您可以使用file.tell() 获取文件的当前位置(以字节为单位)并使用file.seek() 进行设置。

【讨论】:

    【解决方案2】:

    您在这里记录(或保存)读取的行数。问题是如果你开始读取一个文件,你不知道这些行有多长。例如,考虑一个如下所示的文件:

    line1
    line number two
    line3
    

    此文件在您的磁盘上保存为连续流。像这样(在 unix 上):

    line1\nline number two\nline3
    

    现在,无法预先知道 line3 从哪里开始,因为这取决于 line1 和 line3 的长度。你只有在阅读它们后才能知道这一点,并找出\n 字符在哪里。

    因此,您的简单解决方案是记录/保存您所在的实际文件位置。这是您在其他答案中看到的tellf()。这是您在文件中的当前字符。所以你仍然不知道在那之前有多少行,但你至少知道那是你上次离开的地方。

    【讨论】:

      猜你喜欢
      • 2015-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多