Je veux lire un format BSON Dumpo Mongo en python et traiter les données. J'utilise le python package BSON (que je préférerais utiliser plutôt que d'avoir une dépendance pympo-pympo), Mais cela n'explique pas comment lire à partir d'un fichier.
C'est ce que j'essaie: p> mais je reçois: p> Traceback (most recent call last):
File "test.py", line 11, in <module>
b = bson.loads(bson_file)
File "/Library/Python/2.7/site-packages/bson/__init__.py", line 75, in loads
return decode_document(data, 0)[1]
File "/Library/Python/2.7/site-packages/bson/codec.py", line 235, in decode_document
length = struct.unpack("<i", data[base:base + 4])[0]
TypeError: 'file' object has no attribute '__getitem__'
3 Réponses :
charges code> attend une chaîne (c'est ce que signifie "S" signifie), pas un fichier. Essayez de lire dans le fichier et passez le résultat à
charges code>. P>
La documentation indique:
> b = bson.loads(bson_file.read())
J'en ai besoin pour l'exemple assez normal d'un fichier BSON avec plusieurs lignes, où j'utilise ainsi .Readlines () au lieu de .read (). Cela jette une erreur. Au mieux, répondez sur Stackoverflow.com/questions/58474479/ ...
Voulez-vous dire plusieurs objets BSON dans le fichier, un par ligne? B = [BSON.LOADS (LIGNE) POUR LA LIGNE IN BRSON_FILE.Readlines ()] CODE> Travaillez-vous dans ce cas?
Erreur: [pybson.loads (ligne) pour la ligne ouverte (nom de fichier, 'rb'). Readlines ()] Traceback (dernier appel le dernier): fichier "
J'ai installé et l'importait avec import pybson code> comme cela peut être différent de PymonGo
Importer BSON code>, voir Github.com/py-bson/bson/issues/70 . Votre
importe BSON code> est identique que tant que vous n'avez pas d'installation de Pymongo (comme Pymongo
Import BSON code> dominate).
Readlines () ne divise pas la chaîne correctement, ce qui est nécessaire est avec ouvert (nom de fichier, 'rb') comme f: b = f.read () listryte = re.split (rb '(?! \ a) (? = \\!) ', b) Imprimer (len (liststrbyte)) Listbes = [] pour i in Liststryte [: 2]: listbes.append (pybson.loads (i)) code> Voir
Cela donnera une erreur d'attribut. BSON ne prend pas en charge les charges. J'ai essayé de l'exécuter et j'ai eu une erreur comme: AttributeError: Module 'BSON' n'a aucun attribut 'Charges'
J'ai trouvé cela a travaillé pour moi avec un fichier MongoDb 2.4 BSON et PymonGo EM> 'S' BSON 'Module: >>> rawdata[:100]
'\x04\x01\x00\x00\x12_id\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02_type\x00\x07\x00\x00\x00simple\x00\tchanged\x00\xd0\xbb\xb2\x9eI\x01\x00\x00\tcreated\x00\xd0L\xdcfI\x01\x00\x00\x02description\x00\x14\x00\x00\x00testing the bu'
Mais la réponse approuvée est une meilleure façon d'aller
Dans Oder Pour utiliser le code de cette réponse, vous devez utiliser PIP INSTALL PYMONGO code> au lieu de
PIP Installez BSON code> =
PIP Installez Pybson code>. Les deux ont la relève
importe BSON code>. Voir Github.com/py-bson/bson/issues/70
@Max maxMeister Jusqu'à présent, l'exemple de la réponse ne m'aidait pas avec le cas tout à fait normal d'un fichier avec plusieurs lignes d'un fichier de vidage de Mongodb BSON, et à moins que cela ne soit pas répondu à Stackoverflow.com/questions/58474479/... , l'autre réponse n'est pas une meilleure façon aller.
@Lorenz je considère bpson.loads code> mieux car cette fonction a été conçue pour ce cas d'utilisation exacte. Ma réponse traite des données brutes et je suppose qu'il peut être plus flexible si vous chargez quelque chose qui n'est pas correctement codé. Si vous devez charger chaque ligne dans le fichier séparément, vous pouvez essayer le
bson.loads code> sur chaque ligne à la place?
PYBSON B> 'S BSON.LOADS code> semble compliquer les choses dès que vous avez plusieurs lignes. Voir les commentaires sur la réponse Pybson. Au moins de ce que j'ai expérimenté dans la pratique. Votre réponse avec le Pymongo B> 'S
Import BSON code> fonctionne bien.
Je ne comprends pas pourquoi mon édition de la réponse n'a pas été acceptée. "Trusted SO Membres" devait décider de cela et ils ont ignoré la modification. Le module BSON existe à la fois en package Pymongo et dans le paquet BSON. L'expression actuelle «Module BSON de Python» de cette réponse m'a coûté plusieurs heures pour savoir que cette réponse n'est pas basée sur le package BSON car l'autre réponse est. (C'est pourquoi j'ai demandé à BSON de proposer également son colis sous un autre nom, qui est maintenant fait avec Pybson, reportez-vous à la fois Github.com/py-bson/bson/issues/70 )
Il n'apparaît pas que bson.loads attend un fichier.
(Comme indiqué clairement dans la documentation de la méthode code> code>.)