Добавление данных в json-файл в Python

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

[{"name" = "name1", "url" = "url1"}, {"name" = "name2", "url" = "url2"}] 

и т. д. Это то, что у меня есть:

 def add(args): with open(DATA_FILENAME, mode='r', encoding='utf-8') as feedsjson: feeds = json.load(feedsjson) with open(DATA_FILENAME, mode='w', encoding='utf-8') as feedsjson: entry = {} entry['name'] = args.name entry['url'] = args.url json.dump(entry, feedsjson) 

Это создает запись типа {"name" = "some name", "url" = "some url"}. Но, если я снова использую эту функцию add , с другим именем и URL-адресом, первая будет перезаписана. Что мне нужно сделать, чтобы получить вторую (третью …) запись, добавленную к первой?

EDIT: первые ответы и комментарии к этому вопросу указывают на очевидный факт, что я не использую feeds в блоке записи. Однако я не понимаю, как это сделать. Например, следующие, очевидно, не будут делать:

  with open(DATA_FILENAME, mode='a+', encoding='utf-8') as feedsjson: feeds = json.load(feedsjson) entry = {} entry['name'] = args.name entry['url'] = args.url json.dump(entry, feeds) 

6 Solutions collect form web for “Добавление данных в json-файл в Python”

Вероятно, вы хотите использовать список JSON вместо словаря в качестве элемента верхнего уровня.

Итак, инициализируйте файл пустым списком:

 with open(DATA_FILENAME, mode='w', encoding='utf-8') as f: json.dump([], f) 

Затем вы можете добавить новые записи в этот список:

 with open(DATA_FILENAME, mode='w', encoding='utf-8') as feedsjson: entry = {'name': args.name, 'url': args.url} feeds.append(entry) json.dump(feeds, feedsjson) 

Обратите внимание, что это будет медленным, потому что вы будете переписывать полное содержимое файла каждый раз, когда вы вызываете add . Если вы вызываете его в цикле, подумайте о том, чтобы добавить все фиды в список заранее, а затем записать список за один раз.

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

К счастью, есть много других вариантов. Особенно простой – CSV; который хорошо поддерживается стандартной библиотекой python. Самым большим недостатком является то, что он хорошо работает только для текста; он требует дополнительных действий со стороны программиста для преобразования значений в числа или другие форматы, если это необходимо.

Другим вариантом, который не имеет этого ограничения, является использование базы данных sqlite, которая также имеет встроенную поддержку в python. Это, вероятно, будет большим отступлением от кода, который у вас уже есть, но он более естественно поддерживает модель «изменить немного», которую вы, по-видимому, пытаетесь построить.

Добавить запись в содержимое файла, если файл существует, в противном случае добавить запись в пустой список и записать в файл:

 a = [] if not os.path.isfile(fname): a.append(entry) with open(fname, mode='w') as f: f.write(json.dumps(entry, indent=2)) else: with open(fname) as feedsjson: feeds = json.load(feedsjson) feeds.append(entry) with open(fname, mode='w') as f: f.write(json.dumps(feeds, indent=2)) 

Вы никогда не пишете ничего общего с данными, которые вы читаете. Вы хотите добавить структуру данных в каналы к новой, которую вы создаете?

Или, возможно, вы хотите открыть файл в режиме добавления open(filename, 'a') а затем добавить свою строку, написав строку, json.dumps вместо использования json.dump – но nneonneo указывает, что это было бы неверно JSON.

Использование вместо w должно позволить вам обновить файл, а не создавать новую / перезаписывать все в существующем файле.

См. Этот ответ для разницы в режимах.

Одним из возможных решений является конкатенация вручную, вот какой-то полезный код:

 import json def append_to_json(_dict,path): with open(path, 'a+') as f: f.seek(0,2) #Go to the end of file if f.tell() == 0 : #Check if file is empty json.dump([_dict], f) #If empty, write an array else : f.seek(-1,2) f.truncate() #Remove the last character, open the array f.write(' , ') #Write the separator json.dump(_dict,f) #Dump the dictionary f.write(']') #Close the array 

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

  • Анализ данных для создания объекта данных json с помощью Python
  • Чтение арабского языка из файла JSON
  • Преобразование JSON в SQLite в Python - Как правильно сопоставить json-ключи с столбцами базы данных?
  • Преобразование JSON в CSV
  • Возвращение ответа JSON из представления «Флажок»
  • JSON появляется как юникодные объекты в шаблоне Jinja2
  • Почему словарь использует столько ОЗУ в Python
  • сумка-сумка, не использующая все сердечники? альтернативы?
  • Python - лучший язык программирования в мире.