Вы можете изменить параметры в FIND_PATH()
. Вместо использования PATH_SUFFIXES
вы можете использовать что-то вроде этого FIND_PATH(_FREETYPE2_INCLUDE_DIR ft2build.h HINTS ENV FREETYPE2_INCLUDE_DIR PATHS /usr/local/include)
Это то, что я обычно использую, когда пишу файл cmake.
json может быть не лучшим выбором для форматов на диске; Проблема с добавлением данных является хорошим примером того, почему это может быть. В частности, объекты json имеют синтаксис, который означает, что весь объект должен быть прочитан и проанализирован, чтобы понять любую его часть.
К счастью, есть много других вариантов. Особенно простым является CSV; что хорошо поддерживается стандартной библиотекой python. Самым большим недостатком является то, что он работает только для текста; это требует дополнительных действий со стороны программиста для преобразования значений в числа или другие форматы, если это необходимо.
Другим вариантом, который не имеет этого ограничения, является использование базы данных sqlite, которая также имеет встроенную поддержку в 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
. Если вы вызываете его в цикле, рассмотрите возможность добавления всех каналов в список заранее, а затем выписываете список за один раз.
Добавить запись к содержимому файла, если файл существует, в противном случае добавить запись в пустой список и записать в файл:
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))
Одним из возможных решений является конкатенация вручную, вот несколько полезных кодов:
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
При редактировании файла вне сценария следует соблюдать осторожность, чтобы в конце не было добавлено никакого интервала.
Использование a
вместо w
должно позволить вам обновить файл вместо создания нового / перезаписать все в существующем файле.
См. этот ответ для различия в режимах.
Вы никогда не пишете ничего общего с данными, которые вы читаете. Вы хотите добавить структуру данных в лентах к новой, которую вы создаете?
Или, возможно, вы хотите откройте файл в режиме добавления open(filename, 'a')
, а затем добавьте свою строку, записав строку, созданную json.dumps
вместо использования json.dump
- но nneonneo указывает, что это будет недопустимым json.
У меня есть некоторый код, который похож, но не переписывает все содержимое каждый раз. Это предназначено для периодического запуска и добавления записи 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)