Пишу бота на python, и столкнулся с проблемой

Вроде нормальный код, а ошибка не из за чего. Вот код:

Ignoring exception in on_ready
Traceback (most recent call last):
  File "C:\Users\fmalo\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\client.py", line 343, in _run_event
    await coro(*args, **kwargs)
  File "C:\DISCORDBOT\bot.py", line 299, in on_ready
    data = json.load(file)
  File "C:\Users\fmalo\AppData\Local\Programs\Python\Python310\lib\json\__init__.py", line 293, in load
    return loads(fp.read(),
  File "C:\Users\fmalo\AppData\Local\Programs\Python\Python310\lib\json\__init__.py", line 346, in loads
    return _default_decoder.decode(s)
  File "C:\Users\fmalo\AppData\Local\Programs\Python\Python310\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Users\fmalo\AppData\Local\Programs\Python\Python310\lib\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)

Load выполнен, фиг знает. А вот код:

with open("members.json", "a+") as file:
    data = json.load(file)
    data[str(member.id)] = {"name": str(member.name)}
    json.dump(data, file, indent=4)
    file.close()

Ответы (1 шт):

Автор решения: Dmitry

Не используйте "a+" опцию, поскольку указатель откуда работать, всегда будет вставать в конец файла. Обратите внимание на ошибку, она вам говорит, что у вас проблема в первой строке первого столбца, хотя файл не пустой. То есть файл открыт, курсор в самом конце и дальше ничего нет, что логично при таком использовании. Поэтому он и не может быть прочитан и бросает ошибку.

Чтобы это победить, можно использовать file.seek(0), чтобы переместиться в начало. То есть вот так

with open("members.json", "a+") as file:
    file.seek(0) 
    data = json.load(file)

Мое предпочтение - это сначала прочитать, затем изменить, а следом записать. При всем при том, что вы все равно переписываете все данные, поскольку если просто дописать данные в конец (что подразумевает опция "a"), у вас json станет не валидным, поскольку в конец допишется весь обновленный словарь.

with open('members.json') as file:
    data = json.load(file)

data[str(member.id)] = {'name': str(member.name)}

with open('members.json', "w") as file:
    json.dump(data, file, indent=4)

И вам не зачем использовать file.close(), когда вы используете with. Файл автоматически будет закрыт

→ Ссылка