2015-04-30 2 views
0

Я получаю файл (* .png) через сеть, и этот файл записывается (в двоичном режиме) на жесткий диск должным образом.Чтение файла получает EOF до реального EOF

Когда я пытаюсь открыть файл, для дальнейших манипуляций он не будет полностью загружать нижнюю часть png-изображения. Это происходит с несколькими файлами PNG, поэтому это не изолированный случай.

#File received a properly written to HDD 
fp = open(os.path.join(self.savedir, filename), 'wb') 
fp.write(part.get_payload(decode=True)) 
print fp.tell()    # prints correct size, in this case: 343661bytes 
fp.close 

# Reads the data in the file but not till the real EOF 
fin = open(os.path.join(self.savedir, filename), 'rb') 
data = fin.read() 
print len(data)    # prints 339968 
print fin.tell()    # prints correct size, in this case: 339968bytes 
fin.close 

Я использую Python 2.7.9, как на Linux (64bits) и окна (32бит) поведение одинаково на обеих машинах. Эти снайперы кода, где в разных функциях теперь находятся, как показано выше рядом друг с другом для проверки работоспособности. Очевидно, что файл обрабатывается только этой программой, и нет никаких потоков concorrent для любого, кто имеет дело с файлом.

+0

Почему вы используете 'decode = True'? Если это бинарный поток, не стоит ли просто писать его как есть? – bosnjak

+0

Это не может быть ваш настоящий код, потому что он просто поднимет «IndentationError». – abarnert

+1

Лучше открыть файлы с помощью ['with'] (https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects) (см., Например, конец раздела). Это гарантирует, что файл будет закрыт должным образом. –

ответ

4

Проблема в том, что вы не закрываете файл. Эта линия:

fp.close 

... просто ссылается на метод close как значение, он не называет его.

Итак, когда вы открываете тот же файл в режиме чтения, последний буфер обычно не будет очищен на диске. Конечно, когда программа выходит, тогда буфер обычно сбрасывается (хотя это не гарантируется ...), поэтому, когда вы идете, проверьте файл, он выглядит отлично. Это было не совсем прекрасно, когда ваш код пытался его прочитать.

Вы должны круглые скобки называть что-нибудь в Python:

fp.close() 

Или, лучше, использовать with заявление вместо явного close().

+0

Просто не заметил этого. Измените все файлы ввода-вывода в коде на «с», чтобы избежать подобных ошибок. – miguels