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

How do I properly read large text files in Python so I dont clog up memory?

所以今天在购买 BTC 时我搞砸了,丢失了 ATM 自动通过电子邮件发送的钱包解密密码。

我记得密码的最后 4 个字符,所以我生成了一个单词表并想尝试暴力破解。这是一个 4MB 的文件,脚本检查了所有的可能性,但没有成功。然后我意识到也许字母是错误的,但我仍然记得那 4 个字符中的数字。突然间,我有 2GB 的文件被 Ubuntu.

标记

这是完整的代码,很短。

#!/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 亿行。

通常最好的做法是直接遍历文件。文件处理程序将充当生成器,一次生成一行而不是一次将它们全部聚合到内存中到列表中(如 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:
    while True:
        chunk_of_lines = [fh.readline() for i in range(5)] # this will read 5 lines at a time
        if not chunk_of_lines:
            break
        # do something else here

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

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