Обработка json в Python: ошибка чтения

Рейтинг: 0Ответов: 0Опубликовано: 31.01.2023

Задача состоит в том, чтобы сделать 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)

Ответы

Ответов пока нет.