Код Discord.py некорректно читает / записывает файл JSON - PullRequest
0 голосов
/ 29 мая 2020

Мой код для проверки, находится ли пользователь в таблице или нет:

@client.event
async def on_message(ctx):
    id = ctx.author.id
    with open('coins.json') as coins:
        coinData = json.load(coins)

    with open('shop.json') as shop:
        shopData = json.load(shop)

    await client.process_commands(ctx)

    if id in coinData:
        print('exists')
    else:
        coinData["players"][id] = 0
        with open('coins.json', 'w') as coins:
            json.dump(coinData, coins)



Файл JSON, который он читает:

{"players": {"325616103143505932": 0}}

Что происходит, когда кто-то отправляет message:

{"players": {"325616103143505932": 0, "325616103143505932": 0}}

И он не печатает «существует» в консоли, независимо от того, сколько сообщений отправляет человек, но он добавляет пару значений ключа только дважды.

1 Ответ

1 голос
/ 30 мая 2020

В python строковое и целочисленное значения различаются.

>>> a = 1
>>> b = '1'
>>> a == b
False

Таким образом, вам следует либо преобразовать существующий файл json в использование целочисленных идентификаторов (удалив кавычки) или используя str() для преобразования целочисленного идентификатора в строку.

Здесь используется преобразование строки (с целыми числами вам не нужно ничего менять, только обновите свой файл):

@client.event
async def on_message(ctx):
    id = str(ctx.author.id) # this line
    with open('coins.json') as coins:
        coinData = json.load(coins)

    with open('shop.json') as shop:
        shopData = json.load(shop)

    await client.process_commands(ctx)

    if id in coinData:
        print('exists')
    else:
        coinData["players"][id] = 0
        with open('coins.json', 'w') as coins:
            json.dump(coinData, coins)
...