попробуй кроме как в цикле while - python - PullRequest
0 голосов
/ 15 января 2019

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

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 ]

0 голосов
/ 15 января 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
0 голосов
/ 15 января 2019

Если 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)

...