Python – Aktualisieren von JSON-Objekten in einer Datei

Ich habe eine (gültige) JSON-Datei, die JSON-Objekte enthält, wobei jedes Objekt eine Dateizeile aufnimmt. Diese JSON-Objekte ordnen Python-Dicts zu und sind in aufsteigender Reihenfolge durch numerische IDs.

Ich schreibe eine Update-Methode, die drei Argumente akzeptiert: (1) einen Dateipfad, (2) eine Liste geordneter IDs und (3) ein Dict von JSON-Objekteigenschaften mit Update-Werten und durchläuft die Datei (in r+ Modus), sucht nach den JSON-Objekten in der ID-Liste und aktualisiert dann die Objekteigenschaften mit den Werten im Dict und schreibt das Objekt zurück in die Datei.

Jedes Objekt nimmt eine Zeile auf und ist komma getrennt. Wenn die gewünschte ID in einer Zeile ist, dann wird der Zeiger vor dem Schreiben in die Datei um die Länge der Zeile zum Anfang zurückgesetzt. Aber das Problem ist, dass die neue Objektzeile länger sein kann, in diesem Fall überschreibt sie die Zeile eines anderen Objekts, das diesem Objekt folgt.

Ich muss nur die Linie ersetzen, die ich interessiere, aber nicht die folgenden Zeilen überschreiben. Jede Hilfe wäre willkommen.

Hier ist der Code:

 def update_JSON_file( self, file_path, obj_IDs, obj_props ): decoder = json.JSONDecoder() with io.open( file_path, 'r+', encoding='utf=8' ) as file: IDs_iter = iter( obj_IDs ) for line in file: ID = IDs_iter.next() if str( ID ) in line: JSON_obj = decoder.raw_decode( line )[0] for key in props.keys(): JSON_obj[key] = props[key] JSON_obj = json.dumps( JSON_obj, ensure_ascii=False ) if '},\n' in line: JSON_obj += ',\n' JSON_obj = unicode( JSON_obj ) file.seek( file.tell() - len( line ) ) file.write( JSON_obj ) 

  • Wie schreibe ich große JSON Daten?
  • Mehrere Wörterbücher an CSV mit einem Header mit Python schreiben
  • JSON-Daten in das Django-Modell umwandeln
  • Wie kann ich die Tasten bei json.load in python bearbeiten / umbenennen?
  • Werte von JSON mit Python erhalten
  • Wie man eine bestimmte Daten aus dem json mit python
  • Erstellen eines Hierarchiepfads von JSON
  • Python json.loads zeigt ValueError: Extra Daten
  • 2 Solutions collect form web for “Python – Aktualisieren von JSON-Objekten in einer Datei”

    Sie können nicht tun, was Sie wollen, weil Sie nur chirurgisch ersetzen können feste Längen Datensätze in einer Datei. Sie können die Zeile nicht durch etwas ersetzen, das länger oder kürzer ist, da Dateien keine Daten als separate Zeilen speichern.

    Darüber hinaus wird Ihr Code nicht berücksichtigen, dass auf einigen Plattformen (wie auf Windows) Zeilen in Textdateien durch zwei Zeichen getrennt sind, die in Python als \r\n , aber diese Zeilenendungen werden für Sie auf die Single übersetzt Zeichen \n . Ihre Zeilenlängenberechnung berücksichtigt das nicht.

    Du musst doch alles nach dieser Zeile umschreiben. Du wärst es besser, eine Datenbank zu benutzen. sqlite3 kommt mit Python gebündelt, werfen Sie einen Blick darauf.

     def update_JSON_file( self, file_path, obj_IDs, props ): decoder = json.JSONDecoder() with io.open( file_path, 'r+', encoding='utf=8' ) as files: IDs_iter = iter( obj_IDs ) fl = files.read().splitlines(True) ID = IDs_iter.next() for i,line in enumerate(fl): # ID = IDs_iter.next() # I think the 'ID' should be initialized out of the loop # and iterated only if the condition is true if str(ID) in line: JSON_obj = decoder.raw_decode(line)[0] for key in props.keys(): JSON_obj[key] = props[key] JSON_obj = json.dumps( JSON_obj, ensure_ascii=False ) if '},\n' in line: JSON_obj += ',\n' JSON_obj = unicode( JSON_obj ) fl[i] = JSON_obj try: ID = IDs_iter.next() except StopIteration: break files.seek(0) files.write(''.join(fl)) return True 
    Python ist die beste Programmiersprache der Welt.