因此,今天购买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亿行。
答案 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
,将终止循环