Discord.py Я получаю эту ошибку, когда пытаюсь отправить пользовательский префикс в файл JSON: Ожидаемое значение: строка 1 столбец 1 (символ 0)

#python #discord.py #python-3.8

#python #discord.py #python-3.8

Вопрос:

Я пишу discord.py бот, и я пытаюсь создать команду, которая позволяет серверам устанавливать свои собственные префиксы. Это код:

 @bot.command(
    help = "Set the server prefix!"
)
async def setprefix(ctx, arg1):
    with open('prefixes.json', 'a ') as f:
        prefixes = json.load(f)
        prefixes[ctx.guild.id] = arg1
    await ctx.channel.send(f"The server prefix has been set to **{arg1}**")
  

Вот как выглядит файл json:

 {
    "guild_id": "!",
}
  

Здесь «guild_id»: «!» — это просто заполнитель, чтобы он имел смысл.

Когда я запускаю команду на своем тестовом сервере, это ошибка, из-за которой я получаю эту полную расшифровку:

 Ignoring exception in command setprefix:
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/discord/ext/commands/core.py", line 85, in wrapped
    ret = await coro(*args, **kwargs)
  File "/Users/secret/OneDrive/PyBot/Millenium_Build.py", line 174, in setprefix
    prefixes = json.load(f)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/json/__init__.py", line 293, in load
    return loads(fp.read(),
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/json/__init__.py", line 357, in loads
    return _default_decoder.decode(s)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/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)

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/discord/ext/commands/bot.py", line 903, in invoke
    await ctx.command.invoke(ctx)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/discord/ext/commands/core.py", line 859, in invoke
    await injected(*ctx.args, **ctx.kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/discord/ext/commands/core.py", line 94, in wrapped
    raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: JSONDecodeError: Expecting value: line 1 column 1 (char 0)
  

У кого-нибудь есть идеи, как это исправить?

Ответ №1:

 with open('prefixes.json', 'a ') as f:
  

Открытие с a помощью режима открывает файл для добавления, что означает, что указатель начинается с конца файла. Поэтому при вызове читать нечего json.load(f) .

         prefixes[ctx.guild.id] = arg1
  

Эта строка здесь также не имеет никакого эффекта вообще. Он ничего не запишет в файл, если это то, что вы ожидаете сделать.

Вместо этого вы хотите сделать что-то вроде этого:

     with open('prefixes.json') as f:
        prefixes = json.load(f)
    prefixes[ctx.guild.id] = arg1
    with open('prefixes.json', 'w') as f:
        json.dump(prefixes, f)
    ...
  

В идеале вы хотели бы сделать это атомарным действием, но это будет сделано для демонстрации решения возникшей у вас проблемы.

Кроме того, конечная запятая в файле json также вызовет ошибку декодирования (хотя это не та ошибка, которую вы видите здесь).