Python – Обновление объектов JSON в файле

У меня есть (действительный) JSON-файл, содержащий объекты JSON, каждый объект занимает одну строку файла. Эти объекты JSON сопоставляются с питонами Python и находятся в порядке возрастания по числовым идентификаторам.

Я пишу метод обновления, который принимает три аргумента: (1) путь к файлу, (2) список упорядоченных идентификаторов и (3) идентификатор свойств объекта JSON с значениями обновления и проходит через файл (открыт в r+ mode), поиск объектов JSON в списке идентификаторов, а затем обновление свойств объекта с использованием значений в dict и запись объекта обратно в файл.

Каждый объект занимает линию и разделяется запятой. Если желаемый идентификатор находится в строке, то перед записью в файл указатель перемещается назад по длине строки в начало. Но проблема в том, что новая строка объекта может быть длиннее, в этом случае она переписывает линию другого объекта, следующего за этим объектом.

Мне просто нужно заменить интересующую меня строку, но не переписывать последующие строки. Любая помощь будет оценена по достоинству.

Вот код:

 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 ) 

2 Solutions collect form web for “Python – Обновление объектов JSON в файле”

Вы не можете делать то, что хотите, потому что вы можете только хирургически заменить записи фиксированной длины в файле. Вы не можете заменить строку чем-то более длинным или коротким, так как файлы не сохраняют данные в виде отдельных строк.

Кроме того, ваш код не учитывает, что на некоторых платформах (например, в Windows) строки в текстовых файлах разделяются двумя символами, представляемыми в Python как \r\n , но эти окончания строк переводятся для вас в одиночный character \n . Вычисление длины линии не учитывает это.

Вместо этого вы должны переписать все, что следует за этой строкой. Вы бы лучше использовали базу данных; sqlite3 поставляется в комплекте с Python, взгляните на это.

 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 json
  • Могу ли я реализовать пользовательский отступ для довольно-типовой печати в модуле JSON Python?
  • Как записать данные JSON в файл?
  • Как создать JSON-файл с вложенными записями из таблицы плоских данных?
  • отправка данных как объекта JSON из Python в Javascript с Jinja
  • Django Rest Framework: сериализация данных из вложенных json-полей в простой объект
  • Python: прочитайте несколько json-файлов из папки
  • Доступ к словарю по ключу в шаблоне Django
  • Python: изменить тип списка для json-декодирования
  • Разбор дерева ad hoc
  • Вставка JSON в MySQL с использованием Python
  • Python - лучший язык программирования в мире.