12
votes

Lire le fichier BSON à Python?

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> xxx pré>

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__'


2 commentaires

Il n'apparaît pas que bson.loads attend un fichier.


(Comme indiqué clairement dans la documentation de la méthode .)


3 Réponses :


2
votes

charges 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 .


0 commentaires

9
votes

La documentation indique:

> b = bson.loads(bson_file.read())


6 commentaires

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 ()] Travaillez-vous dans ce cas?


Erreur: [pybson.loads (ligne) pour la ligne ouverte (nom de fichier, 'rb'). Readlines ()] Traceback (dernier appel le dernier): fichier "", ligne 1, dans Fichier "", ligne 1, dans Fichier "C: \ Utilisateurs \ User \ AppData \ Programmes locaux \ Python \ Python38-32 \ LIB \ Site-Packages \ Pybso n \ __ init__.py ", Ligne 47, dans Loads Retour Decode_Document (données, 0) [1] Fichier" C: \ Utilisateurs \ User \ AppData \ Local \ Programmes \ Python \ Python38-32 \ LIB \ SITE-PACKAGES \ PYBSO N \ CODEC .py », à la ligne 277, en decode_document si les données [end_point - 1] pas ( '\ 0', 0): IndexError: indice hors de portée


J'ai installé et l'importait avec import pybson comme cela peut être différent de PymonGo Importer BSON , voir Github.com/py-bson/bson/issues/70 . Votre importe BSON est identique que tant que vous n'avez pas d'installation de Pymongo (comme Pymongo Import BSON 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)) Voir Stackoverflow.com/Questtions/62591863/... Pour plus de détails sur cette fente de regex. J'ai arrêté la boucle à [: 2], prenez cette contrainte après les tests. Mon PC LIMITÉ s'est écrasé à [: 9], donc j'utilise plus facilement Pymongo maintenant, voir la réponse Pymongo.


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'



11
votes

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'        


6 commentaires

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 au lieu de PIP Installez BSON = PIP Installez Pybson . Les deux ont la relève importe BSON . 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 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 sur chaque ligne à la place?


PYBSON 'S BSON.LOADS 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 'S Import BSON 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 )