Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Вопрос по работе с json-файлами на python

Андрей Ученик (128), на голосовании 22 часа назад
После запуска этого кода:

import json


def write_to_json(text):
with open(FILE_NAME, "a+", encoding="windows-1251") as file:
json.dump(text, file)


def read_json():
with open(FILE_NAME) as file:
data = json.load(file)
return data



FILE_NAME = "data.json"

dict1 = {"test1": 1,
"test2": 2}

dict2 = {"test3": 3,
"test4": 4}

write_to_json(dict1)
write_to_json(dict2)

print(f"Из файла прочитано {read_json()}")

Я получаю следующую ошибку:

Traceback (most recent call last):
File "C:\Users\Алла\Desktop\Андрей\Проекты_по_программированию\PycharmProjects\черновики пайчарм\все\test_json.py", line 27, in <module>
print(f"Из файла прочитано {read_json()}")
File "C:\Users\Алла\Desktop\Андрей\Проекты_по_программированию\PycharmProjects\черновики пайчарм\все\test_json.py", line 11, in read_json
data = json.load(file)
File "C:\Users\Алла\AppData\Local\Programs\Python\Python38\lib\json\__init__.py", line 293, in load
return loads( fp.read (),
File "C:\Users\Алла\AppData\Local\Programs\Python\Python38\lib\json\__init__.py", line 357, in loads
return _default_decoder.decode(s)
File "C:\Users\Алла\AppData\Local\Programs\Python\Python38\lib\json\decoder.py", line 340, in decode
raise JSONDecodeError("Extra data", s, end)
json.decoder.JSONDecodeError: Extra data: line 1 column 25 (char 24)

Process finished with exit code 1

После ошибки json-файл выглядит так:
{"test1": 1, "test2": 2}{"test3": 3, "test4": 4}

Я так понимаю, что ошибка происходит из за того что между первым и вторым словарем нет запятой. Но как реализовать постановку запятой автоматически? Пробовал ставить в такой формат:
{
list=[
{"test1": 1, "test2": 2}
{"test3": 3, "test4": 4}
]
}
Но при следующем запуске снова была получена ошибка, из за того что новые словари добавлялись не в список list а в самый конец. Как убрать ошибку/реализовать авто-постановку запятой/добавление словарь в список list?
Голосование за лучший ответ
Андрей Высший разум (462142) 1 месяц назад
 def write_to_json(text):
# никаких "a+"; "w" и только "w"
# Никаких CP1251; JSON - это Unicode
# ensure_ascii=False - если хочешь человекочитаемый русский текст
with open(FILE_NAME, "w", encoding="UTF-8") as file:
json.dump(text, file, ensure_ascii=False)

FILE_NAME = "data.json"

dict1 = {"test1": 1,
"test2": 2}

dict2 = {"test3": 3,
"test4": 4}

# В JSON-файл записывается ОДНО значение
write_to_json([dict1, dict2])
Ошибка в том, что ты записываешь в файл НЕСКОЛЬКО JSON-текстов. Это так не работает. Нельзя к JSON-тексту просто взять и приписать другой JSON-текст.

Дописывание чего-то в JSON-файл делается так:
 temp = read_json() # читаем и распаковываем существующий JSON
temp.append({"test5": 5}) # вносим изменения в распакованное
write.json(temp) # упаковываем и записываем новый JSON
Похожие вопросы