Пишу бота на 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 шт):
Не используйте "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. Файл автоматически будет закрыт