Comment puis-je utiliser Python pour transformer de MongoDB bsondump en JSON?
J'ai donc une énorme quantité de .bfils à partir d'un MongoDB dump. Je suis à l'aide de bsondump sur la ligne de commande, de la tuyauterie de la sortie comme stdin pour python. Ce succès se convertit en BFILS à 'JSON', mais c'est en fait une chaîne de caractères, et ne semble pas légale JSON.
Par exemple une ligne entrante ressemble à ceci:
{ "_id" : ObjectId( "4d9b642b832a4c4fb2000000" ),
"acted_at" : Date( 1302014955933 ),
"created_at" : Date( 1302014955933 ),
"updated_at" : Date( 1302014955933 ),
"_platform_id" : 3,
"guid" : 72106535190265857 }
Qui je pense est Mongo Étendu JSON.
Quand j'ai lu dans une de ces lignes et à faire:
json_line = json.dumps(line)
J'obtiens:
"{ \"_id\" : ObjectId( \"4d9b642b832a4c4fb2000000\" ),
\"acted_at\" : Date( 1302014955933 ),
\"created_at\" : Date( 1302014955933 ),
\"updated_at\" : Date( 1302014955933 ),
\"_platform_id\" : 3,
\"guid\" : 72106535190265857 }\n"
Qui est encore <type 'str'>
.
J'ai aussi essayé de
json_line = json.dumps(line, default=json_util.default)
(voir pymongo json_util - détection de spam empêche un troisième lien )
Qui semble sortie le même que dumps ci-dessus. charges donne une erreur:
json_line = json.loads(line, object_hook=json_util.object_hook)
ValueError: No JSON object could be decoded
Alors, comment puis-je transformer la chaîne de TenGen JSON dans parseable JSON?
(le but final est de l'onglet flux de données séparées pour une autre base de données)
- Avez-vous regardé
bson
? pypi.python.org/pypi/bson/0.3.2 - Ne rien faire d'autre que de supprimer un Mongo dépendance? Je ne comprends pas comment cela pourrait être mon problème, mais je vais regarder un peu plus.
- double possible de Impossible de désérialiser PyMongo ObjectId de JSON
- J'ai vu que l'un et essayé d'utiliser l'aide. Mais si vous remarquez, la chaîne de il a le précédent de 'u' en face de '_id' et un intervenant a indiqué que représente une chaîne unicode python
- WTH est qui? Le lien renvoie à cette question.
- Désolé pour la confusion, @VSG24. Je vais le supprimer.
Vous devez vous connecter pour publier un commentaire.
Ce que vous avez est un vidage de Mongo Étendue de JSON dans TenGen mode (voir ici). Voici quelques façons de le faire:
Si vous pouvez vider encore une fois, l'utilisation Stricte mode de sortie par le biais de la MongoDB API REST. Cela devrait vous donner un réel JSON au lieu de ce que vous avez maintenant.
Utilisation
bson
de http://pypi.python.org/pypi/bson/ lire la BFILS vous avez déjà en Python structures de données et ensuite faire tout le traitement vous avez besoin (et éventuellement de la sortie JSON).Utiliser MongoDB liaisons Python pour se connecter à la base de données pour obtenir les données en Python, et puis faire ce que le traitement dont vous avez besoin. (Si nécessaire, vous pouvez configurer un local MongoDB instance et d'importer vos fichiers jetés là-dedans.)
Convertir les Mongo Étendu JSON de TenGen mode en mode Strict. Vous pourriez développer un filtre séparé pour le faire (lire à partir de stdin, remplacer TenGen structures Strict des structures, et afficher le résultat sur la sortie standard stdout) ou vous pouvez le faire comme vous le processus de l'entrée.
Voici un exemple d'utilisation de Python et des expressions régulières:
En fonction de votre objectif, l'un d'eux doit être un point de départ raisonnable.
chargement d'un ensemble de bfils document en python de la mémoire est chère.
Si vous voulez le lire, plutôt que de se charger de l'ensemble du dossier et de faire une brassée de tous, vous pouvez essayer cette bibliothèque.
https://github.com/bauman/python-bson-streaming
Vous pouvez convertir les lignes de la bfils fichier comme ceci:
Chaque valid_dict élément sera un python dict que vous pouvez convertir en json.
Vous pouvez enlever les types de données et d'obtenir une stricte json avec la regex: