如何正确地在Python中读取大型文本文件,以免阻塞内存?

时间:2019-04-12 18:35:08

标签: python file large-files

因此,今天购买BTC时,我搞砸了我的解密密码,并将其丢失到了ATM通过电子邮件自动发送的钱包中。

我记得密码短语的最后4个字符,所以我生成了一个单词列表,并希望尝试以蛮横的方式进入它。这是一个4MB的文件,脚本检查了所有可能性,但是没有运气。然后我意识到也许字母是错误的,但是我仍然记得那4个字符中的数字。突然之间,我有2GB的文件被Ubuntu SIGKILLed了。

这是整个代码,非常短。

#!/usr/bin/python

from zipfile import ZipFile
import sys
i = 0
found = False

with ZipFile("/home/kuskus/Desktop/wallet.zip") as zf:
    with open('/home/kuskus/Desktop/wl.txt') as wordlist:
        for line in wordlist.readlines():
            if(not found):
                try:
                    zf.extractall(pwd = str.encode(line))
                    print("password found: %s" % line)
                    found = True
                except:
                    print(i)
                    i += 1
            else: sys.exit()

我认为问题在于文本文件填满了内存,因此OS杀死了它。我真的不知道如何读取文件,也许要读取1000行,然后再清理并再读取1000行。如果有人可以帮助我,我将非常感激,在此先感谢您:)哦,如果重要的话,文本文件有大约3亿行。

1 个答案:

答案 0 :(得分:3)

通常最好的做法是直接遍历文件。文件处理程序将充当生成器,一次生成一行,而不是将所有行一次汇总到内存中(如fh.readlines()一样):

with open("somefile") as fh:
     for line in fh:
         # do something

此外,文件句柄允许您选择以下内容来读取特定数量的数据:

with open("somefile") as fh:
    number_of_chars = fh.read(15) # 15 is the number of characters in a StringIO style handler
    while number_of_chars:
        # do something with number_of_chars
        number_of_chars = fh.read(15)

或者,如果您想读取特定数量的行:

with open('somefile') as fh:
    chunk_of_lines = [fh.readline() for i in range(5)] # this will read 5 lines at a time
    while chunk_of_lines:
        # do something else here
        chunk_of_lines = [fh.readline() for i in range(5)]

fh.readline()类似于在for循环中调用next(fh)

在后两个示例中使用while循环的原因是,一旦文件完全迭代完成,fh.readline()fh.read(some_integer)将产生一个空字符串,其作用为False,将终止循环