我有这个脚本:http://pastebin.com/JypqErN5 在这一刻功能工作输入输出文件:
encrypt_file(in_file, out_file, password):
需要输入输出到同一个文件,明白这个:
encrypt_file(in_file, password):
我尝试使同名输入输出bat不正确加密文件。
功能如下:
def encrypt_file(input_file, output_file, password):
with open(input_file, 'rb') as in_file, open(output_file, 'wb') as out_file:
encrypt(in_file, out_file, password)
我该怎么做这个编辑?谢谢所有
答案 0 :(得分:1)
您通常不能同时读取和写入文件。
所以,你有两个基本选择。
首先,您可以读入内存,然后加密,然后写回。希望你有一个encrypt
函数,它适用于字符串而不是文件。由于您已标记此pycrypto
,并且其所有引擎都在字符串上工作,因此这应该是微不足道的。但是如果必须使用文件,通常可以使用BytesIO
(或者,对于2.x,cStringIO.StringIO
),它将字节字符串包装在类似文件的对象中,如下所示:
def encrypt_file(path, password):
temp = io.BytesIO()
with open(path, 'rb') as in_file:
encrypt(in_file, temp, password)
with open(path, 'wb') as out_file:
out_file.write(temp.getvalue())
这很简单,但当然如果你的文件很庞大,它可能会成为一个问题。
或者您可以使用临时文件写入NamedTemporaryFile
,然后replace
原始文件:
def encrypt_file(path, password):
dir = os.path.dirname(path)
with open(path, 'rb') as in_file, tempfile.NamedTemporaryFile(dir=dir, delete=False) as out_file:
encrypt(in_file, temp, password)
os.replace(temp.name, path)
这比其他方法有一些主要优点 - 它不一定占用大量内存(这取决于encrypt
的编写方式),如果写os.replace
的话,也不会留下部分写入的文件你拔掉插头(replace
是原子的 - 它要么完全发生,要么根本不发生)。但它有点复杂。而且,在Python 3.3之前,没有rename
函数。在Unix上,{{1}}也可以正常工作。在Windows上......好吧,那是一团糟。