python写二进制大文件,打开和写入一个大的二进制文件python

我有一个基于web的自制文件系统,允许用户以zip格式下载文件;但是,我在本地设备上开发时发现了一个问题,这个问题在生产系统上不存在。在

在linux中,这不是问题(localdev框是windows系统)。在

我有以下代码algo = CipherType('AES-256', 'CBC')

decrypt = DecryptCipher(algo, cur_share.key[:32], cur_share.key[-16:])

file = open(settings.STORAGE_ROOT + 'f_' + str(cur_file.id), 'rb')

temp_file = open(temp_file_path, 'wb+')

data = file.read(settings.READ_SIZE)

while data:

dec_data = decrypt.update(data)

temp_file.write(dec_data)

data = file.read(settings.READ_SIZE)

# Takes a dump right here!

# error in cipher operation (wrong final block length)

final_data = decrypt.finish()

temp_file.write(final_data)

file.close()

temp_file.close()

上面的代码打开一个文件,然后(使用当前文件共享的密钥)解密该文件并将其写入一个临时位置(稍后将填充到zip文件中)。在

我的问题在file = open(settings.STORAGE_ROOT + 'f_' + str(cur_file.id), 'rb')行上。因为如果我不指定'rb'的话,windows会关心二进制文件,所以文件不会在数据读取循环中读取结束;但是,由于某些原因,因为我也在写入temp_file,它永远不会完全读取到文件的末尾…,除非在b'rb+'后面添加a+。在

如果我将代码改为file = open(settings.STORAGE_ROOT + 'f_' + str(cur_file.id), 'rb+'),那么一切都会正常工作,代码会成功地抓取整个二进制文件并对其进行解密。如果我不添加加号,它将失败,无法读取整个文件。。。在

代码的另一部分(用于下载单个文件)读(无论操作系统如何,都能完美地工作):

^{pr2}$

澄清

密码错误很可能是因为文件没有被完整读取。例如,我有一个500MB的文件,每次读取64*1024字节。当我在windows中不指定b时,我一直在读直到我不再收到字节,它会循环两次并返回一些糟糕的数据(因为python认为它与字符串文件而不是二进制文件进行交互)。在

当我指定b时,完全读入文件需要10-15秒,但它成功地完成了,代码也正常完成了。在

当我从源文件读入时,同时写入另一个文件(如第一个示例中所示),如果我不指定rb+,它显示的行为与甚至没有指定{}相同,也就是说,在关闭句柄并继续前进之前,它只从文件中读取两个片段,最后我得到了一个不完整的文件,解密失败了。在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值