Ajouter une liste de dictionnaires Python dans un fichier sans le charger
Suppose que j'ai besoin d'avoir un fichier de base de données constituée d'une liste de dictionnaires:
fichier:
[
{"name":"Joe","data":[1,2,3,4,5]},
{ ... },
...
]
J'ai besoin d'avoir une fonction qui reçoit une liste de dictionnaires comme indiqué ci-dessus et l'ajoute au fichier. Est-il un moyen de le réaliser, en utilisant json (ou toute autre méthode), sans charger le fichier?
EDIT1:
Remarque: Ce dont j'ai besoin, consiste à ajouter de nouveaux dictionnaires à un fichier déjà existant sur le disque.
- Qu'entendez-vous par "sans chargement"?
- Eh bien, une façon est de charger le fichier dans la mémoire, ajouter la nouvelle liste et vider le résultat dans le disque. Est-il possible de simplement écrire la nouvelle liste pour le disque, d'ajouter à la fin du fichier, sans charger le fichier de la mémoire?
- Cela pourrait être utile: stackoverflow.com/questions/12460943/... Charger le nouveau dict dans un nouveau fichier, puis de fusionner les deux fichiers, peut-être?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser json pour vider les dicts, un par ligne. Maintenant, chaque ligne est un json unique dict que vous avez écrit. Vous perdez la liste externe, mais vous pouvez ajouter des enregistrements avec un simple ajout au fichier existant.
La liste peut être monté ultérieurement
Le fichier ressemble à
Si elle est nécessaire pour maintenir le fichier json valide, il peut être fait comme suit:
Le fichier s'ouvre pour les deux la lecture et l'écriture. Ensuite, il va à la fin du fichier (en octets zéro à partir de la fin) pour trouver le fichier de la fin de la position (par rapport au début du fichier) et va au dernier octet du dos, qui dans un fichier json est prévu pour représenter le caractère
]
. En fin de compte, il ajoute un nouveau dictionnaire de la structure, en remplaçant le dernier caractère du fichier et à le garder pour être json valide. Il ne lit pas le fichier dans la mémoire. Testé avec les deux ANSI et codé en utf-8 fichiers en Python 3.4.3 avec petit et grand (5 GO) fichiers factices.Une variation, si vous aussi vous avez
os
module importé:Il définit la longueur en octets du fichier à aller à la position d'un octet de moins (comme dans l'exemple précédent).
Si vous êtes à la recherche pour ne pas charge le fichier, allez à ce sujet avec
json
n'est pas vraiment la bonne approche. Vous pouvez utiliser un fichier mappé en mémoire... et ne jamais charger le fichier en mémoire -- unmemmap
tableau peut ouvrir le fichier et créer un tableau "sur le disque" sans charger quoi que ce soit dans la mémoire.Créer un mappage de mémoire tableau des dicts:
Maintenant lire le tableau, sans charger le fichier:
Le contenu du fichier est chargé en mémoire lorsque la liste est créée, mais ce n'est pas nécessaire, vous pouvez utiliser le tableau sur le disque sans le charger.
Il faut une quantité négligeable de temps (par exemple nanosecondes) pour créer un mappage de mémoire tableau qui peut un fichier d'index, indépendamment de la taille (ex: 100 GO) du fichier.
En utilisant la même approche que user3500511...
Supposons que nous avons deux listes de dictionnaires (dicts, dicts2). Les dicts sont convertis au format json cordes. Dicts est enregistrée dans un nouveau fichier de test.json. Test.json est rouvert et la chaîne des objets sont mis en forme avec le bon délimiteurs. Avec le reformaté objets, dict2 peut être ajouté et le fichier conserve encore la structure adéquate pour un objet JSON.