2013-12-12 5 views
5

Il salvataggio di un file in GridFS di Mongodb con pymongo determina un file troncato.Il salvataggio di un file in GridFS di Mongodb con pymongo si traduce in un file troncato - python 2.7 su Windows 7

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 

In Windows 7, l'esecuzione di questo programma genera questo output:

145047 
864 

Su Ubuntu, l'esecuzione di questo programma genera questo (corretto) Uscita:

145047 
145047 

Purtroppo, l'applicazione che sto lavorando per il sistema operativo Windows ...

Qualsiasi aiuto sarebbe apprezzato ed!

in modo da poter riprodurre il mio esempio in modo più rigoroso, 'owl.jpg' è stato scaricato da: http://getintobirds.audubon.org/sites/default/files/photos/wildlife_barn_owl.jpg

risposta

5

Eh, cambiando

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

a:

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

fissa il comportamento di il programma su Windows 7. Peccato che il comportamento sia diverso tra i sistemi operativi ...

+0

Anche su Linux ho dovuto aprire il file con 'rb' altrimenti avrei ottenuto l'errore '' str 'non supporta l'interfaccia buffer' ' –

3

hai già avuto la risposta, ma per i curiosi:

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

In Windows, 'b' aggiunto al modo si apre il file in modalità binaria, quindi non ci sono modalità anche come 'rb', 'wb' e 'r + b'. Python su Windows distingue tra file di testo e binari; i caratteri di fine riga nei file di testo vengono automaticamente modificati leggermente quando i dati vengono letti o scritti. Questa modifica "dietro le quinte" dei dati dei file va bene per i file di testo ASCII, ma corrompe i dati binari come quelli nei file JPEG o EXE. Prestare molta attenzione all'utilizzo della modalità binaria durante la lettura e la scrittura di tali file.

Problemi correlati