功能加密文件 - 输入和输出输出到python中的同一文件

时间:2014-11-24 23:04:44

标签: python pycrypto

我有这个脚本: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)

我该怎么做这个编辑?谢谢所有

1 个答案:

答案 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上......好吧,那是一团糟。