如何正确读取 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
并将终止循环
所以今天在购买 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
并将终止循环