मैं एक 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}**")

जसन फ़ाइल इस तरह दिखती है:

{
    "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)

क्या किसी के पास कोई विचार है कि इसे कैसे ठीक किया जाए?

0
Daericul 7 नवम्बर 2020, 19:52

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 फ़ाइल में एक अनुगामी अल्पविराम भी एक डिकोड त्रुटि का कारण बनेगा (हालाँकि यह वह त्रुटि नहीं है जो आप यहाँ देख रहे हैं)।

0
sytech 7 नवम्बर 2020, 17:03