我正在使用python加密一些文件,但是我遇到了通过chunk读取文件块的问题。
有时候不会返回最后一个块的所有数据。
当文件长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)
我得到了这个:
File 1 (307200): Chunk length: 65536 Chunk length: 65536 Chunk length: 65536 Chunk length: 65536 Chunk length: 45056 Chunk length: 0 File 2 (279363): Chunk length: 65536 Chunk length: 65536 Chunk length: 65536 Chunk length: 65536 Chunk length: 16384 Chunk length: 0
如您所见,第一个文件的所有块大小的总和是正确的,第二个文件的总和不是。我不明白为什么。
我的Python版本是2.6.5
(在Ubuntu 10.04.2 LTS上运行)
*编辑:我自己的愚蠢错误。在阅读我刚写的文件之前,我使用了w.close
而不是w.close()
,这导致了问题。
答案 0 :(得分:4)
你在Windows上运行吗?如果是这样,您可能需要open your files in binary mode:
infile = open('somefile','rb')
答案 1 :(得分:1)
我现在感到非常愚蠢,但我很高兴没有人注意到同样的问题。
我正在调用w.close,而不是w.close()
答案 2 :(得分:0)
这很奇怪。
您是否创建了第二个文件作为第一个文件,名称为'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