Сохранение файла в GridFS Mongodb с помощью pymongo приводит к усеченному файлу-python 2.7 В Windows 7

сохранение файла в GridFS Mongodb с помощью pymongo приводит к усеченному файлу.

from pymongo import MongoClient
import gridfs
import os

#just to make sure we aren't crazy, check the filesize on disk:
print os.path.getsize( r'owl.jpg' )

#add the file to GridFS, per the pymongo documentation: http://api.mongodb.org/python/current/examples/gridfs.html
db = MongoClient().myDB
fs = gridfs.GridFS( db )
fileID = fs.put( open( r'owl.jpg', 'r')  )
out = fs.get(fileID)
print out.length

в Windows 7 запуск этой программы генерирует этот вывод:

145047
864

на Ubuntu, запуск этой программы генерирует этот (правильный) вывод:

145047
145047

к сожалению, приложение, над которым я работаю, нацелено на ОС Windows...

любая помощь будет оценили!

Так что вы можете воспроизвести мой пример более строго, сова.jpg ' был скачано с: http://getintobirds.audubon.org/sites/default/files/photos/wildlife_barn_owl.jpg

2 ответов


Хех, изменение

fileID = fs.put( open( r'owl.jpg', 'r')  )

в:

fileID = fs.put( open( r'owl.jpg', 'rb')  )

исправлено поведение программы в Windows 7. Жаль, что поведение отличается между ОС...


вы уже получили ответ, но для любопытных:

http://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files

в Windows "b", добавленный в режим, открывает файл в двоичном режиме, поэтому есть также такие режимы, как "rb", " wb " и "r+b". Python в Windows делает различие между текстовыми и двоичными файлами; символы конца строки в текстовых файлах автоматически слегка изменяются при чтении данных или написанный. Эта закулисная модификация данных файла хороша для текстовых файлов ASCII, но она повредит двоичные данные, как в JPEG или EXE-файлах. Будьте очень осторожны, чтобы использовать двоичный режим при чтении и записи таких файлов.