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 konvertiert man JSON-Daten in ein Python-Objekt
  • Wie man json array in python filtert
  • Python, Json und String-Indizes müssen ganze Zahlen sein, nicht Str
  • Python: Wie würdest du eine einfache Einstellungen / Konfigurationsdatei speichern?
  • Json.loads funktioniert nicht mit Binär JSON posted von AngularJS in Python
  • Textuell abweichendes JSON
  • Ajax json query direkt zu python generiert html wird undefiniert
  • Einfache JSON-Codierung mit Python
  • 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.