问题描述
|
我正在使用python加密某些文件,但是在逐块读取文件时遇到了问题。
有时它不会返回最后一块的所有数据。
当文件为307200字节长时,我没有问题。
当它长为279363字节时,我会这样做。
我将这段代码运行在2个文件上(分别是307200和279363字节大)
chunksize = 65536
w = open(filename + \'.\' + str(cs) + \'.split\',\'wb\')
tdata = f.read(307200)
w.write(tdata)
w.close
infile.open(filename + \'.\' + str(cs) + \'.split\',\'rb\')
while True:
chunk = infile.read(chunksize)
print \"Chunk length: \" + str(len(chunk))
if len(chunk) == 0:
break
elif len(chunk) % 16 != 0:
chunk += \' \' * (16 - len(chunk) % 16)
我得到了:
文件1(307200):
块长度:65536
块长度:65536
块长度:65536
块长度:65536
块长:45056
块长:0
文件2(279363):
块长度:65536
块长度:65536
块长度:65536
块长度:65536
区块长度:16384
块长:0
如您所见,第一个文件的所有块大小的总和正确,第二个文件的总和不正确。而且我不知道为什么。
我的Python版本是2.6.5
(在Ubuntu 10.04.2 LTS上运行)
*编辑:我自己的愚蠢错误。在读取我刚刚编写的文件之前,我使用w.close
而不是ѭ2and,这引起了问题。
解决方法
您在Windows上运行吗?如果是这样,您可能需要以二进制模式打开文件:
infile = open(\'somefile\',\'rb\')
,我现在感到非常愚蠢,但是我很高兴没有其他人注意到相同的问题。
我打电话给w.close,而不是w.close()
,这很奇怪。
您是否从名称\'filename \'的文件中创建了第二个文件作为第一个文件,并将307200替换为279363?
顺便说一下,它是文件名的奇怪扩展名:\'。split \'
。
我建议您运行以下代码:
from os.path import getsize
chunksize = 65536
for x in xrange(279363,307201):
w = open(filename + \'.\' + str(cs) + \'.split\',\'wb\')
tdata = f.read(x)
w.write(tdata)
w.close
siz = getsize(filename + \'.\' + str(cs) + \'.split\')
if siz!=x:
print \'file has not the right size\'
print \'x==\'+str(x)+\' size of created file : \'+str(siz)
infile.open(filename + \'.\' + str(cs) + \'.split\',\'rb\')
li = []
while True:
chunk = infile.read(chunksize)
li.append(str(len(chunk)))
if len(chunk) == 0:
break
if sum(li)==x:
print \'good at \'+str(x)
break
也尝试一下
from os import fsync
chunksize = 65536
w = open(filename + \'.\' + str(cs) + \'.split\',\'wb\')
tdata = f.read(307200)
w.write(tdata)
w.flush()
fsync(w.fileno())
w.close