【问题标题】:Python not returning all data when reading file chunk by chunk逐块读取文件时Python不返回所有数据
【发布时间】:2011-08-04 19:37:55
【问题描述】:

我正在使用 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 而不是w.close(),这导致了问题。

【问题讨论】:

  • 您是否考虑过输入文件本身?什么样的内容,编码等等。
  • 删除加密代码是否有效?也就是说,如果你所做的只是复制文件,你的代码是否有效?
  • 这在 Python 2.6.1 上对我有用 - 你最好说明你的操作系统、Python 版本和 CPU 架构 - 以及文件内容的性质(我刚刚重新记录了一个 279363 字节的 "\xaa"s 文件)

标签: python file-io chunking


【解决方案1】:

您在 Windows 上运行吗?如果是这样你可能需要open your files in binary mode:

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

【讨论】:

  • 对不起,应该添加该信息。它在 Linux 上,我已经在 rb 模式下打开它。我会添加更多信息。
【解决方案2】:

这很奇怪。

您是否从名为“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 

【讨论】:

    【解决方案3】:

    我现在觉得自己很愚蠢,但我很高兴没有其他人注意到同样的问题。

    我调用的是 w.close,而不是 w.close()

    【讨论】:

      猜你喜欢
      • 2012-06-22
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 2015-06-19
      • 2016-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多