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 ) 

  • Keine Antwort mit POST-Anfrage und Content-Type "application / json" in der Flasche
  • Python: Konvertiere JSON (zurückgegeben von URL) in List
  • Python-Load-Json-Datei mit UTF-8 BOM-Header
  • Pandas dataframe zu json ohne index
  • Sortierung von JSON-Objekten in eine Hierarchie
  • Erhalten Sie spezifische JSON-Elemente mit Anfragen
  • Flasche App auf pythonanywhere, Python JSON decodieren Fehler
  • Wie bekomme ich einen json String aus der Liste in 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.