Как добавить данные в файл JSON?

Вы можете изменить параметры в FIND_PATH(). Вместо использования PATH_SUFFIXES вы можете использовать что-то вроде этого FIND_PATH(_FREETYPE2_INCLUDE_DIR ft2build.h HINTS ENV FREETYPE2_INCLUDE_DIR PATHS /usr/local/include) Это то, что я обычно использую, когда пишу файл cmake.

29
задан martineau 29 March 2019 в 20:31
поделиться

7 ответов

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

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

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

30
ответ дан SingleNegationElimination 29 March 2019 в 20:31
поделиться

Вы, вероятно, хотите использовать список 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. Если вы вызываете его в цикле, рассмотрите возможность добавления всех каналов в список заранее, а затем выписываете список за один раз.

32
ответ дан nneonneo 29 March 2019 в 20:31
поделиться

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

a = []
if not os.path.isfile(fname):
    a.append(entry)
    with open(fname, mode='w') as f:
        f.write(json.dumps(a, 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))
11
ответ дан Neves4 29 March 2019 в 20:31
поделиться

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

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

При редактировании файла вне сценария следует соблюдать осторожность, чтобы в конце не было добавлено никакого интервала.

8
ответ дан Hamza Rashid 29 March 2019 в 20:31
поделиться

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

См. этот ответ для различия в режимах.

4
ответ дан Community 29 March 2019 в 20:31
поделиться

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

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

3
ответ дан Thomas 29 March 2019 в 20:31
поделиться

У меня есть некоторый код, который похож, но не переписывает все содержимое каждый раз. Это предназначено для периодического запуска и добавления записи JSON в конец массива.

Если файл еще не существует, он создает его и выгружает JSON в массив. Если файл уже создан, он доходит до конца, заменяет ] на ,, удаляет новый объект JSON, а затем снова закрывает его другим ]

# Append JSON object to output file JSON array
fname = "somefile.txt"
if os.path.isfile(fname):
    # File exists
    with open(fname, 'a+') as outfile:
        outfile.seek(-1, os.SEEK_END)
        outfile.truncate()
        outfile.write(',')
        json.dump(data_dict, outfile)
        outfile.write(']')
else: 
    # Create file
    with open(fname, 'w') as outfile:
        array = []
        array.append(data_dict)
        json.dump(array, outfile)
0
ответ дан Matt 29 March 2019 в 20:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: