2012-01-26 3 views
3

J'ai une liste de dictionnaires data_dump qui contient des dictionnaires comme:problème d'encodage insérer dans MongoDB avec Python

d = {"ids": s_id, "subject": subject} 

que je suis le tutoriel en essayant de faire un insert en vrac:

connection = Connection(host,port) 
db = connection['clusters'] 
posts = db.posts 
posts.insert(data_dump) 

qui échoue avec l'erreur suivante:

File "/usr/local/lib/python2.7/dist-packages/pymongo/collection.py", line 312, in insert 
continue_on_error, self.__uuid_subtype), safe) 
bson.errors.InvalidStringData: strings in documents must be valid UTF-8 

Veuillez nous aviser. Merci

+0

L'exception est assez claire. Une chaîne dans data_dump n'est pas valide utf8. D'où provient data_dump? –

+0

A partir d'un fichier texte. – Fraz

+0

Essayez d'utiliser la fonction 'codecs.open' pour lire le fichier. Donc 'open (" file.txt "," r ")' deviendrait 'codecs d'importation; codecs.open ("fichier.txt", "r", "utf-8") ' – stderr

Répondre

3

Résolu: bien .. forcé le codage par 1) à dénuder la chaîne de symboles, etc , puis 2) la conversion ASCII pour utf-8 par raw.decode ('ascii'), puis decoded_string. encoder ('utf8') Merci les gars .. :)

+8

Un peu de code ne nuirait pas, n'est-ce pas? – Sekai

+0

partagez votre code ... – JeffC

0

Je ne pouvais pas me permettre de perdre les caractères non utf-8. J'ai donc choisi de convertir la chaîne en binaire, à la place.

Comme par votre exemple,

>>> print subject 
u'Math' 
>>> d = {"ids": s_id, "subject": bson.Binary(str(subject))} # convert subject from unicode to Binary 

Vous ne pouvez pas effectuer des recherches en texte intégral, qui est la dernière caractéristique de Mongo, mais il fonctionne bien pour tout le reste.