簡體   English   中英

Python在按塊讀取文件塊時不返回所有數據

[英]Python not returning all data when reading file chunk by chunk

我正在使用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

如您所見,第一個文件的所有塊大小的總和是正確的,第二個文件的總和是NOT。 我不明白為什么。

我的Python版本是2.6.5
(在Ubuntu 10.04.2 LTS上運行)

*編輯:我自己的愚蠢錯誤。 我在閱讀剛才寫的文件之前使用了w.close而不是w.close() ,這導致了問題。

你在Windows上運行嗎? 如果是這樣,您可能需要以二進制模式打開文件

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

我現在感到非常愚蠢,但我很高興沒有人注意到同樣的問題。

我在調用w.close,而不是w.close()

那很奇怪。

您是否創建了第二個文件作為第一個文件,從名稱'filename'文件創建並用279363替換307200

順便說一句,它是文件名的奇怪擴展名: '。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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM