Я абсолютно предпочитаю идею Джеффа Йетса. Он будет работать отлично, если вы слегка измените его:
string regex = String.Format ("[{0}]", Regex.Escape (новая строка (Path.GetInvalidFileNameChars ())) ); Regex removeInvalidChars = new Regex (regex, RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.CultureInvariant);
Улучшение заключается в том, чтобы избежать автоматического создания регулярного выражения.
Вероятно, вы хотите использовать JSON list вместо словаря в качестве элемента верхнего уровня.
Итак, инициализируйте файл пустым списком:
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
вместо w
должно позволить вам обновить файл вместо создания нового / перезаписать все в существующем файле.
См. этот ответ для разница в режимах.
[data1, data2, ..., dataN][dataN+1, dataN+2, ...]
– Eduardo Pignatelli
4 April 2018 в 09:37
Одно из возможных решений - выполнить конкатенацию вручную, вот какой-то полезный код:
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
Вы должны быть осторожны при редактировании файла вне сценария, не добавляя никакого промежутка в конце.
json не может быть лучшим выбором для форматов на диске; Проблема, связанная с добавлением данных, является хорошим примером того, почему это может быть. В частности, объекты json имеют синтаксис, который означает, что весь объект должен быть прочитан и проанализирован, чтобы понять любую его часть.
К счастью, есть много других вариантов. Особенно простой - CSV; который хорошо поддерживается стандартной библиотекой python. Самым большим недостатком является то, что он хорошо работает только для текста; он требует дополнительных действий со стороны программиста для преобразования значений в числа или другие форматы, если это необходимо.
Другой вариант, который не имеет этого ограничения, заключается в использовании базы данных sqlite, которая также имеет встроенную базу данных, в поддержке в python. Это, вероятно, будет большим отступлением от кода, который у вас уже есть, но он более естественно поддерживает модель «изменить немного», которую вы, по-видимому, пытаетесь построить.
[json.loads(i) for i in open('somefile.json','r').readlines()]
– Jonno_FTW
24 August 2017 в 01:20
Вы никогда не пишете ничего, что связано с данными, которые вы читаете. Хотите добавить структуру данных в каналы к новой, которую вы создаете?
Или, возможно, вы хотите для открытия файла в режиме добавления open(filename, 'a')
, а затем добавьте свою строку, написав строку, созданную json.dumps
, вместо использования json.dump
, но nneonneo указывает, что это будет недействительным json.
{"a":"b"}{"c":"d"}
).
– nneonneo
21 October 2012 в 03:41
Добавить запись в содержимое файла, если файл существует, в противном случае добавить запись в пустой список и записать в файл:
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))
feeds
не указан в вашем примере кода. Должен ли он быть json.dump исходного файла? Это то, что я пытался, и это, похоже, не работает. – Schiphol 21 October 2012 в 11:07add
. – nneonneo 21 October 2012 в 17:17with open(DATA_FILENAME, mode='r', encoding='utf-8') as f: json.dump([], f)
, вы хотите использоватьwith open(DATA_FILENAME, mode='w', encoding='utf-8') as f: json.dump([], f)
вместо этого, чтобы открыть файл для записи, вместо чтения (если файл не существует, его нельзя прочитать). – Blairg23 5 November 2015 в 13:56