3

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

ご覧のとおり、最初のファイルのすべてのチャンク サイズの合計は正しく、2 番目のファイルの合計は正しくありません。そして、私には理由がわかりません。

私のPythonバージョンは2.6.5です
(Ubuntu 10.04.2 LTSで実行)

*編集:私の愚かな過ち。書いたばかりのファイルを読み取る前のw.close代わりに使用しましたが、それが問題の原因でした。w.close()

4

3 に答える 3

1

私は今とてもばかげていると感じていますが、同じ問題に誰も気づいていないことを嬉しく思います.

w.close() ではなく、w.close を呼び出していました

于 2011-06-22T22:27:37.683 に答える
0

それは変です。

'filename' という名前のファイルから 2 番目のファイルを最初のファイルとして作成し、307200279363に置き換えましたか?

ちなみにファイル名の拡張子「.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 
于 2011-04-13T17:38:20.537 に答える