Python не возвращает все данные при чтении фрагмента файла по фрагменту - PullRequest
3 голосов
/ 13 апреля 2011

Я шифрую некоторые файлы с помощью 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)

И я получил это:

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() перед чтением файла, который я только что написал, и это вызвало проблему.

Ответы [ 3 ]

4 голосов
/ 13 апреля 2011

Вы работаете в Windows? Если это так, вам может понадобиться открыть файлы в двоичном режиме :

infile = open('somefile','rb')
1 голос
/ 23 июня 2011

Теперь я чувствую себя очень глупо, но я отчасти рад, что никто не заметил такой же проблемы.

Я звонил w.close, а не w.close ()

0 голосов
/ 13 апреля 2011

Странно.

Вы создали второй файл как первый, из файла с именем 'filename' и заменив 307200 на 279363 ?

ByКстати, это странное расширение для имени файла: '. 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 
...