使用pymongo在Mongodb的GridFS中保存文件会导致截断文件 - Windows 7上的python 2.7

时间:2013-12-12 18:41:26

标签: python mongodb pymongo gridfs

使用pymongo在Mongodb的GridFS中保存文件会导致截断文件。

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操作系统......

任何帮助将不胜感激!

所以你可以更严格地再现我的例子,'owl.jpg'从以下网址下载:http://getintobirds.audubon.org/sites/default/files/photos/wildlife_barn_owl.jpg

2 个答案:

答案 0 :(得分:8)

嘿,改变

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

为:

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

修复了Windows 7上程序的行为。太糟糕了,操作系统的行为不同......

答案 1 :(得分:3)

你已经得到了答案,但对于好奇的人来说:

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

  

在Windows上,附加到模式的'b'以二进制模式打开文件,因此还有'rb','wb'和'r + b'等模式。 Windows上的Python区分文本和二进制文件;读取或写入数据时,文本文件中的行尾字符会自动稍微改变。这种对文件数据的幕后修改适用于ASCII文本文件,但它会破坏像JPEG或EXE文件中的二进制数据。在读写这些文件时要非常小心使用二进制模式。