Python: FileNotFoundError не обнаружен блоком try-except

Недавно я начал изучать Python и столкнулся с проблемой, на которую не могу найти ответ. Идея программы состоит в том, чтобы запросить имя пользователя, загрузить словарь из файла JSON и, если имя есть в словаре, вывести любимый номер пользователя.

Код, который загружает файл JSON, выглядит так:

import json

fav_numbers = {}
filename = 'numbers.JSON'

name = input('Hi, what`s your name? ')
try:
    with open(filename) as f_obj:
        fav_numbers = json.load(f_obj)
except FileNotFoundError:
    pass

if name in fav_numbers.keys():    

    print('Hi {}, your fav number is {}, right?'.format(name, fav_numbers[name]))

else:
    number = input('Hi {}, what`s your favourte number? '.format(name))
    fav_numbers[name] = number

    with open(filename, 'w') as f_obj:
        json.dump(fav_numbers, filename)

Тем не менее, когда я пытаюсь запустить его, он падает, говоря мне:

Exception has occurred: FileNotFoundError
[Errno 2] No such file or directory: 'numbers.JSON'
  File "/home/niedzwiedx/Dokumenty/Python/ulubionejson.py", line 22, in <module>
    with open(filename) as f_obj:

Что я делаю неправильно, чтобы поймать исключение? (Уже пробовал изменить FileNotFoundError на OSError или IOError)


person Ni3dzwi3dz    schedule 23.01.2020    source источник
comment
Не могу воспроизвести. Это действительно весь ваш код?   -  person Mike Scotty    schedule 23.01.2020
comment
Ошибка, вероятно, возникает где-то еще в вашем коде. Можете ли вы предоставить больше кода и полную трассировку ошибки?   -  person Valentin M.    schedule 23.01.2020
comment
на самом деле это недостаточно информации   -  person aNup    schedule 23.01.2020
comment
Спасибо за быстрый ответ. Я добавил полный код и сообщение об ошибке.   -  person Ni3dzwi3dz    schedule 23.01.2020
comment
Ваш отредактированный код не должен соответствовать предоставленной ошибке. Если файл не существует, он должен завершиться ошибкой в ​​​​строке 13 с KeyError при доступе к if fav_numbers[name]: . Что касается вашего отредактированного вопроса: строка 22 не заключена в блок try..except, только строки 8 и 9.   -  person Mike Scotty    schedule 23.01.2020
comment
Спасибо. Я отредактировал его, и теперь он должен работать.   -  person Ni3dzwi3dz    schedule 23.01.2020
comment
Ваша трассировка по-прежнему не соответствует предоставленному вами коду: with open(filename) as f_obj: в вашей трассировке на самом деле with open(filename, 'w') as f_obj: в вашем коде. Вы уверены, что запускаете тот же файл, который редактируете?   -  person Valentin M.    schedule 23.01.2020


Ответы (1)


Ошибка исходит из вашей последней строки, за пределами вашей попытки/за исключением

with open(filename, 'w') as f_obj:
        json.dump(fav_numbers, filename)

имя файла - это строка, а не файл.

Вы должны использовать

with open(filename, 'w') as f_obj:
        json.dump(fav_numbers, f_obj)

Для дополнительной безопасности вы также можете окружить эту часть блоком try/except.

try:
    with open(filename, 'w') as f_obj:
        json.dump(fav_numbers, f_obj)
except (FileNotFoundError, PremissionError):
    print("Impossible to create JSON file to save data")

person Valentin M.    schedule 23.01.2020