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 
  • Как сохранить потоковые твиты в json через tweepy?
  • HttpPost возвращает ошибку при использовании MultipartEntityBuilder в Android
  • У модуля Python JSON нет атрибутов 'dumps'
  • Спецификация в ответ сервера откликается на json parsing
  • TypeError: b'1 'не является сериализуемым JSON
  • Вложенный словарь с двойными ключами, но с разными значениями
  • Пытается разобрать JSON на Python. ValueError: ожидание имени свойства
  • Является синтаксисом JSON строгим подмножеством синтаксиса Python?
  • Python - лучший язык программирования в мире.