Исправление «TypeError:« _io.TextIOWrapper »объект не является подписным» в скрипте Python - PullRequest
0 голосов
/ 23 мая 2019

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

Я использую Python 3.7.3, последнюю версию переписать. Я попытался переместить файл config.json безрезультатно. Я, наверное, упускаю что-то невероятно очевидное, но я не знаю, что.

Где возбуждается исключение:

with open("config.json", "r") as infile:
    try:
        CONFIG = json.load(infile)
        _ = infile["token"]
        _ = infile["owner"]

    except (KeyError, FileNotFoundError):
        raise EnvironmentError(
            "Your config.json file is either missing, or incomplete. Check your config.json and ensure it has the keys 'token' and 'owner_id'"
        )

Ожидаемый результат: код извлекает token и owner из файла и переходит к запуску бота.

Фактический результат: Бот не запускается. Вывод трассировки -

  File "/Users/prismarine/Desktop/Project_Prismarine/core.py", line 11, in <module>
    _ = infile["token"]
TypeError: '_io.TextIOWrapper' object is not subscriptable

1 Ответ

1 голос
/ 23 мая 2019

Вы пытаетесь вызвать дескриптор файла как словарь вместо словаря JSON, хранящегося в CONFIG. Вместо этого попробуйте:

with open("config.json", "r") as infile:
    try:
        CONFIG = json.load(infile)
        token = CONFIG["token"]
        owner = CONFIG["owner"]

    except (KeyError, FileNotFoundError):
        raise EnvironmentError(
            "Your config.json file is either missing, or incomplete. Check your config.json and ensure it has the keys 'token' and 'owner_id'"
        )

Обратите внимание, что подчеркивания обычно используются в качестве имен переменных, если они нигде не используются, и что подчеркивание будет присвоено CONFIG['token'], а затем немедленно переназначено на CONFIG['owner'] в вашем случае. Я дал им несколько новых уникальных имен переменных, если вы планируете использовать их позже.

...