如何读取一个非常大的文本文件的最后一个MB

nks*_*ya1 12 python text jython file

我试图在文本文件的末尾附近找到一个字符串.问题是文本文件的大小可能有很大差异.从3MB到4GB.但每次我尝试运行脚本在大约3GB的文本文件中找到此字符串时,我的计算机内存不足.所以我想知道是否有任何方式让python找到文件的大小,然后读取它的最后一兆字节.

我目前使用的代码如下,但正如我之前所说,我似乎没有足够大的内存来读取这么大的文件.

find_str = "ERROR"
file = open(file_directory)                           
last_few_lines? = file.readlines()[-20:]   

error? = False  

for line in ?last_few_lines?:
    if find_str in line:
    ?    error? = True
Run Code Online (Sandbox Code Playgroud)

Ary*_*rog 26

使用file.seek():

import os
find_str = "ERROR"
error = False
# Open file with 'b' to specify binary mode
with open(file_directory, 'rb') as file:
    file.seek(-1024 * 1024, os.SEEK_END)  # Note minus sign
    if find_str in file.read():
        error = True
Run Code Online (Sandbox Code Playgroud)

您必须在打开文件时指定二进制模式,否则您将获得"未定义的行为".在python2下,无论如何它都可以工作(它对我来说),但是如果在默认文本模式下打开文件,python3下seek()将引发io.UnsupportedOperation异常.python 3文档在这里.虽然从那些文档中不清楚,SEEK_*常量仍然在os模块中.

更新:使用with语句进行更安全的资源管理,如Chris Betti所建议的那样.