Mit Python kann ich ein hartnäckiges Wörterbuch behalten und es ändern?

Also, ich möchte ein Wörterbuch in einer persistenten Datei speichern. Gibt es eine Möglichkeit, regelmäßige Wörterbuchmethoden zu verwenden, um Einträge aus dem Wörterbuch in dieser Datei hinzuzufügen, zu drucken oder zu löschen?

Es scheint, dass ich in der Lage wäre, cPickle zu benutzen, um das Wörterbuch zu speichern und es zu laden, aber ich bin nicht sicher, wo ich es von dort nehmen soll.

  • Wie man ein Python-Dict mit Multiprocessing synchronisiert
  • Zusammenführen von 2 csv-Dateien
  • Ersetzen von Zeichen in einem String mit Wörterbuch in Python
  • Suchen und sortieren Wörterbuch in Python
  • Multiplizieren von Werten aus zwei verschiedenen Wörterbüchern in Python
  • Ausgabe sortierte Python dict innerhalb django Vorlage
  • Wörterbuch korrupt den Namen des Schlüssels [Python]
  • Wie man nur den Schlüsselwert aus dieser list-dict json Antwort extrahiert?
  • 7 Solutions collect form web for “Mit Python kann ich ein hartnäckiges Wörterbuch behalten und es ändern?”

    Wenn Ihre Schlüssel (nicht unbedingt die Werte) Strings sind, tut das Regal- Standard-Bibliotheksmodul das, was man ziemlich nahtlos wünscht.

    Entpacken Sie aus der Datei, wenn das Programm geladen wird, ändern Sie als normales Wörterbuch im Speicher, während das Programm läuft, pickle to file, wenn das Programm beendet wird? Nicht sicher genau das, was du hier verlangst.

    Verwenden Sie JSON

    Ähnlich wie bei der Antwort von Pete mag ich JSON, weil es sehr gut auf Python-Datenstrukturen abbildet und sehr gut lesbar ist:

    Anhaltende Daten sind trivial:

    >>> import json >>> db = {'hello': 123, 'foo': [1,2,3,4,5,6], 'bar': {'a': 0, 'b':9}} >>> fh = open("db.json", 'w') >>> json.dump(db, fh) 

    Und das Laden ist etwa gleich:

     >>> import json >>> fh = open("db.json", 'r') >>> db = json.load(fh) >>> db {'hello': 123, 'bar': {'a': 0, 'b': 9}, 'foo': [1, 2, 3, 4, 5, 6]} >>> del new_db['foo'][3] >>> new_db['foo'] [1, 2, 3, 5, 6] 

    Darüber hinaus leidet JSON-Beladung nicht unter den gleichen Sicherheitsproblemen, die shelve und pickle tun, obwohl IIRC ist es langsamer als Gurke.

    Wenn du bei jeder Operation schreiben willst:

    Wenn du bei jeder Operation speichern möchtest, kannst du das Python dict-Objekt subklassen:

     import os import json class DictPersistJSON(dict): def __init__(self, filename, *args, **kwargs): self.filename = filename self._load(); self.update(*args, **kwargs) def _load(self): if os.path.isfile(self.filename) and os.path.getsize(self.filename) > 0: with open(self.filename, 'r') as fh: self.update(json.load(fh)) def _dump(self): with open(self.filename, 'w') as fh: json.dump(self, fh) def __getitem__(self, key): return dict.__getitem__(self, key) def __setitem__(self, key, val): dict.__setitem__(self, key, val) self._dump() def __repr__(self): dictrepr = dict.__repr__(self) return '%s(%s)' % (type(self).__name__, dictrepr) def update(self, *args, **kwargs): for k, v in dict(*args, **kwargs).items(): self[k] = v self._dump() 

    Was du so verwenden kannst:

     db = DictPersistJSON("db.json") db["foo"] = "bar" # Will trigger a write 

    Das ist kläglich ineffizient, kann aber schnell aus dem Boden kommen.

    Angenommen, die Schlüssel und Werte haben Arbeit Implementierungen von repr , eine Lösung ist, dass Sie die String-Darstellung des Wörterbuchs ( repr(dict) ) in Datei speichern. Du kannst es mit der eval Funktion laden ( eval(inputstring) ). Es gibt zwei Hauptnachteile dieser Technik:

    1) Wird nicht mit Typen arbeiten, die eine unbrauchbare Implementierung von repr haben (oder sogar scheinen zu funktionieren, aber scheitern). Du musst zumindest etwas Aufmerksamkeit auf das, was los ist, bezahlen.

    2) Ihr File-Load-Mechanismus ist grundsätzlich ausgerüstet Python-Code. Nicht gut für die Sicherheit, wenn Sie den Eingang nicht vollständig kontrollieren.

    Es hat 1 Vorteil: Absolut einfach zu tun.

    Meine Lieblingsmethode (die keine Standardpython-Wörterbuchfunktionen verwendet): Lesen / Schreiben von YAML-Dateien mit PyYaml . Sehen Sie diese Antwort für Details , zusammengefasst hier:

    Erstellen Sie eine YAML-Datei, "employment.yml":

     new jersey: mercer county: pumbers: 3 programmers: 81 middlesex county: salesmen: 62 programmers: 81 new york: queens county: plumbers: 9 salesmen: 36 

    Schritt 3: Lesen Sie es in Python

     import yaml file_handle = open("employment.yml") my__dictionary = yaml.safe_load(file_handle) file_handle.close() 

    Und jetzt hat my__dictionary alle Werte. Wenn du das nötig machst, schaffe einen String mit YAML und analysiere ihn mit yaml.safe_load.

    Beizen hat einen Nachteil. Es kann teuer sein, wenn dein Wörterbuch von der Festplatte gelesen und geschrieben werden muss und es groß ist. Gurke entleert das Zeug unten (ganz). Unpickle bekommt das Zeug (als Ganzes).

    Wenn man kleine dicts behandeln muss, ist pickle ok. Wenn du mit etwas komplexer arbeiten wirst, geh für berkelydb. Es ist grundsätzlich gemacht, um Schlüssel zu speichern: Wertpaare.

    Wenn nur Strings als Schlüssel verwendet werden (wie vom shelve erlaubt) ist nicht genug, das FileDict könnte ein guter Weg sein, dieses Problem zu lösen.

    Python ist die beste Programmiersprache der Welt.