Python分块读取文件时未返回所有数据

3 投票
3 回答
2713 浏览
提问于 2025-04-16 15:39

我正在用Python加密一些文件,但在逐块读取文件时遇到了一些问题。

有时候最后一块的数据没有全部返回。

当文件大小是307200字节时,我没有问题;但当文件大小是279363字节时,就出现了问题。

我在两个文件上运行了这段代码(分别是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上)

*补充:这是我自己的愚蠢错误。我在读取我刚写的文件之前用了而不是,这导致了问题。

3 个回答

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 
1

我现在觉得自己很傻,不过还好没有其他人发现同样的问题。

我本来应该用 w.close(),结果却只写了 w.close。

4

你是在使用Windows系统吗?如果是的话,你可能需要以二进制模式打开你的文件

infile = open('somefile','rb')

撰写回答