Попробуй кроме как в цикле while - python

Прежде чем объяснить свой вопрос, я делюсь своим кодом, чтобы было легче начать прямо оттуда.

import matplotlib.pylab as plt
import os

while True:
    try:
        img_name = input('Enter the image file name: ')
        img = plt.imread(os.path.join(work_dir, 'new_images_from_web\\', img_name + '.jpg'))
    except FileNotFoundError:
        print('Entered image name does not exist.')
        img_name = input('Please enter another image file name: ')
        img = plt.imread(os.path.join(work_dir, 'new_images_from_web\\', img_name + '.jpg'))

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

FileNotFoundError: [Errno 2] No such file or directory:

На самом деле, с кодом выше, после второго ошибочного ввода я получаю сообщение об ошибке с исключением FileNotFoundErrorв то время как я хотел бы, чтобы цикл продолжался до тех пор, пока существующее имя файла не будет введено в качестве входных данных. Что я делаю не так в while цикл или в остальной части кода?

2 ответа

Решение

Если exception происходит за пределами try: except: это приведет к краху вашей программы. Задавая новый вход после except: вы находитесь вне контекста захвата: в результате происходит сбой вашей программы.

Исправить:

import matplotlib.pylab as plt
import os

while True:
    try:
        img_name = input('Enter the image file name: ')
        img = plt.imread(os.path.join(work_dir, 'new_images_from_web\\', img_name + '.jpg'))
        if img is None:
            print("Problem loading image")
        else:
            break  
    except FileNotFoundError:
        print('Entered image name does not exist.')

# or check img here if you allow a None image to "break" from above
if img:
    # do smth with img if not None

Важно также проверить / обработать None так как imread() может вернуть None если возникают проблемы с загрузкой изображения (файл существует / поврежден... или.txt)

Это помогает!

while Ture:
    try:
        img_name = input('Enter the image file name: ')
        img = plt.imread(os.path.join(work_dir, 'new_images_from_web\\', img_name + '.jpg'))
        if not img:
            print("Err")
        else:
            break
    except FileNotFoundError:
        print('Entered image name does not exist.')
    else:
        break
Другие вопросы по тегам