Обработка json в Python: ошибка чтения
Задача состоит в том, чтобы сделать key-values хранилище с интерфейсом в argparse и сохранением в json. На строке storage = json.load(f)
возникает ошибка
ile "/home/jktl/Python_prgs/storage.py", line 12, in <module>
storage = json.load(f) #in storage saves whole json, then json is cleared.
File "/usr/lib/python3.10/json/__init__.py", line 293, in load
return loads(fp.read(),
File "/usr/lib/python3.10/json/__init__.py", line 346, in loads
return _default_decoder.decode(s)
File "/usr/lib/python3.10/json/decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python3.10/json/decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
Считывать пустые json-файлы нельзя, но специально для этого я делаю проверку на пустоту json-файла и если он пуст в него добавляется пустой словарь (это обрабатывается корректно, я проверял, пустой словарь записывается). По идее, при чтении в storage = json.load(f)
в storage
должен записаться пустой словарь, с которым далее идет работа, но почему-то происходит ошибка, которая, как я понимаю, случается при попытке чтения пустого файла. Вместо пустого словаря пробовал записывать и простой словарь с одним ключом и одним значением для последующей работы с ним, но это также не помогло. В чем проблема и что с этим можно сделать?
import argparse
import os
import tempfile
import json
storage_path ='storage.data'
with open(storage_path, 'r+') as f:
file_content = f.read().strip()
if not file_content:
json.dump(dict(), f) #writing empty dict if there's empty file works perfectly
storage = json.load(f) #in storage saves whole json, then json is cleared, then modified storage written to json as new dict.
json.dump(None, f) #json cleared
parser = argparse.ArgumentParser()
parser.add_argument("--key", help = "Give a key")
parser.add_argument("--val", help = "Give a value")
args = parser.parse_args()
if (args.val == None):
with open(storage_path, 'r+') as f:
temp_dict = json.load(f)
print(*temp_dict[args.key], sep = ', ')
else:
if args.key not in storage:
storage.setdefault(args.key, [])
storage[args.key].append(args.val)
with open(storage_path, 'w') as f:
json.dump(storage, f)