попробуйте, кроме как в цикле 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 или в остальной части кода?


person Ric S    schedule 14.01.2019    source источник
comment
То есть цикл работает с первого раза?   -  person SuperStew    schedule 15.01.2019
comment
@SuperStew Я не думаю, что это цикл, но в первый раз он работает для части try: except:   -  person Ric S    schedule 15.01.2019


Ответы (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

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

person Patrick Artner    schedule 14.01.2019

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

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
person Jundullah    schedule 14.01.2019