Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/40: Рейтинг темы: голосов - 40, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 06.09.2018
Сообщений: 24

Обработка ошибки FileNotFoundError

06.09.2018, 14:16. Показов 7627. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Необходимо произвести вводов имени файла, если файл с таким именем не найден (возникает ошибка FileNotFoundError).
Необходим рабочий кусок кода для возможности повторного введения имени файла (без ограничений количества попыток).
Мой код ограничен по количеству попыток ввода (в данном примере всего две попытки):
Python
1
2
3
4
5
6
7
8
try:
    file_name = str(input('Введите имя текстового файла: '))
except FileNotFoundError:
        pass
else:
    print('Файл найден!')
finally:
    file_name = str(input('Введите имя текстового файла: '))
Большое спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.09.2018, 14:16
Ответы с готовыми решениями:

При повторном появлении ошибки обработка ошибки не срабатывает
Логика: - Пользователь. Нажимает кнопку; - Код . Создаёт "Recordset" "rstStud"(студенты) и "rstGroupStud"(ГруппыСтуденты);...

FileNotFoundError
Добрый день! Возник вопрос по обработке исключений. Проблему хотелось бы разобрать на конкретном примере. Имеется скрипт : excel=...

buildozer FileNotFoundError:
Здравствуйте! С помощью андроид приложения Termux установил Ubuntu. В Ubuntu установил всё, чего требует инструкция для работы buildozer....

6
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
06.09.2018, 14:50
как то так
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from sys import stdin, stdout, stderr
from os import path
 
def message(msg):
    stdout.write(msg)
 
def prompt(msg):
    message(msg)
    return stdin.readline().rstrip('\n')
 
def get_file_name():
    while True:
        name = prompt('Введите имя файла: ')
        if path.exists(name) and path.isfile(name):
            return name
        message('Указанный файл не найден\n')
 
if __name__ == '__main__':
    print(get_file_name())
0
0 / 0 / 0
Регистрация: 06.09.2018
Сообщений: 24
06.09.2018, 16:55  [ТС]
Спасибо за ответ!
Я так понимаю в Вашей версии необходимо указывать полный путь к файлу, а также теперь необходимо указывать расширение файла (относительный путь не работает).
Но, тем не менее, вылезает другая ошибка:
Traceback (most recent call last):
File "D:\Python\поиск слова в файле.py", line 24, in <module> print(name)
NameError: name 'name' is not defined”.
И еще мне не очень понятен код. Не могли бы Вы немного пояснить его.
Спасибо!
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
06.09.2018, 19:22
Цитата Сообщение от Sador01 Посмотреть сообщение
Я так понимаю в Вашей версии необходимо указывать полный путь к файлу, а также теперь необходимо указывать расширение файла (относительный путь не работает).
относительные пути работают.
да, расширение нужно указывать(но вы это можете поправить, немного изменив функцию get_file_name)
Цитата Сообщение от Sador01 Посмотреть сообщение
NameError: name 'name' is not defined”
переменная name не объявлена в текущей области видимости.
Вам нужно почитать про функции, модули и области видимости.
Цитата Сообщение от Sador01 Посмотреть сообщение
Не могли бы Вы немного пояснить его.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/usr/bin/env python2
# coding=utf-8
 
from sys import stdin, stdout
from os import path
 
 
def show(message):
    """Печатает сообщение в консоль
 
    :param message: сообщение для вывода
    :type message: str
    :rtype: None
    """
    stdout.write(message)
    stdout.flush()
 
 
def prompt(message):
    """Запрашивает ввод строки
 
    :param message: строка сообщения
    :return: введенная строка
    :type message: str
    :rtype: str
    """
    show(message)             # показать сообщение
    line = stdin.readline()   # считать строку
    line = line.rstrip('\n')  # удалить лишнее
 
    return line
 
 
def get_file_name():
    """Запрашивает у пользователя ввод имени файла
 
    Запрос на ввод повторяется, если введеный путь несуществует либо не является файлом
 
    Пример использования: `file_name = get_file_name()`
 
    :return: строка, имя файла
    :rtype: str
    """
    while True:
        # запрашиваем имя
        name = prompt('Введите имя файла: ')
 
        # проверяем ввод
        if path.exists(name):      # путь существует?
            if path.isfile(name):  # это файл?
                return name        # да, возвращаем имя
            else:
                show('Указанный путь не является файлом\n')
        else:
            show('Указанный путь не существует\n')
 
 
def start():
    """
    :rtype: None
    """
    # Здесь ваш код
    file_name = get_file_name()
 
    print(file_name)
 
 
if __name__ == "__main__":
    start()
1
0 / 0 / 0
Регистрация: 06.09.2018
Сообщений: 24
07.09.2018, 15:48  [ТС]
Спасибо!

Вас не затруднит ответить на несколько моих вопросов?
1. Программа работает корректно и без конструкции «if __name__ == "__main__":»
Как я понял, это конструкция применяется, если проект состоит из двух файлов. Первый играет роль точки входа приложения, например, в нем происходит отрисовка графики и работа с пользовательским интерфейсом. А второй содержит логику — набор функций, которые вызываются из графики. Первый производит импорт второго.
У нас вроде не тот случай.
Или может это сделано для того, чтобы запретить исполнять этот файл, если его хотят импортировать и использовать из другого модуля. Т.е. в таком случае код будет исполняться только при условии, что данный файл запущен как самостоятельная программа?
2. Что происходит в:
stdout.write(message)
stdout.flush()
(Программа работает и без этих конструкций).
3. Почему нельзя записать вместо конструкции « line = stdin.readline()» конструкцию
«line = str (input (message))»?
4. Почему необходимо удалить из полученной (line) строки \n - переход на следующую строку (line = line.rstrip('\n'))?
5. Цикл «while True:» - как я понял, навечно True при любых обстоятельствах и это обеспечивает требуемый результат?

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

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
from sys import stdin, stdout
from os import path
 
a = True
 
def show(message):
    """Печатает сообщение в консоль
 
    :param message: сообщение для вывода
    :type message: str
    :rtype: None
    """
 
def prompt(message):
    """Запрашивает ввод строки
 
    :param message: строка сообщения
    :return: введенная строка
    :type message: str
    :rtype: str
    """
 
    line = str(input(message))
    return line
 
def get_file_name():
    """Запрашивает у пользователя ввод имени файла
 
    Запрос на ввод повторяется, если введеный путь несуществует либо не является файлом
 
    Пример использования: `file_name = get_file_name()`
 
    :return: строка, имя файла
    :rtype: str
    """
 
    global a
    while a == True:
        # запрашиваем имя
        name = prompt('Введите имя файла: ')
 
        # проверяем ввод
        if path.exists(name):      # путь существует?
            if path.isfile(name):  # это файл?
                return name        # да, возвращаем имя
            else:
                show('Указанный путь не является файлом\n')
        else:
            show('Указанный путь не существует\n')
 
 
def start():
 
    """
    :rtype: None
    """
    # Здесь ваш код
    global name
    
 
    name = get_file_name()
 
 
 
start()

Большое спасибо!

P.S. Как в комментариях на форуме с деталь подсветку синтаксиса кода (как у Вас)?
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
09.09.2018, 18:38
Лучший ответ Сообщение было отмечено Sador01 как решение

Решение

Цитата Сообщение от Sador01 Посмотреть сообщение
1. Программа работает корректно и без конструкции «if __name__ == "__main__":»
В Python любой файл можно использовать как самостоятельную программу так и как модуль.
Я добавил эту проверку, чтобы была возможность использовать функции из этого файла в других программах.
Цитата Сообщение от Sador01 Посмотреть сообщение
2. Что происходит в:
stdout - это файл, ассоциированный с выводом в консоль
То есть это печать строки
Цитата Сообщение от Sador01 Посмотреть сообщение
3. Почему нельзя записать вместо конструкции
Поведение input зависит от версии Python:
в 2.x ввод прогоняется через функцию eval, что приводит к попытке вычисления введенного выражения
в 3.x оно просто считывает строку.
Получается, что чтение из stdin(файла ввода) через readline более универсальный способ
Цитата Сообщение от Sador01 Посмотреть сообщение
4. Почему необходимо удалить из полученной (line)
особенность работы метода readline - он записывает в результат символ новой строки, а нам он не нужен.
Цитата Сообщение от Sador01 Посмотреть сообщение
5. Цикл «while True:»
Да, это "бесконечный" цикл.
Он повторяется, пока пользователь не введет подходящее значение
Для выхода из него использован оператор return
Можно было бы использовать break, если были нужны какие то дополнительные действия

Цитата Сообщение от Sador01 Посмотреть сообщение
Как в комментариях на форуме с деталь подсветку синтаксиса кода
Меню "Навигация" >> Памятка «Как работать в редакторе сообщений»

Для кода на Python используйте "тэг"[PYTHON][/PYTHON]
1
0 / 0 / 0
Регистрация: 06.09.2018
Сообщений: 24
10.09.2018, 15:34  [ТС]
Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.09.2018, 15:34
Помогаю со студенческими работами здесь

pytest FileNotFoundError
file_workers/py def read_from_file(filepath): with open(filepath, 'r') as f_o: return f_o.readlines() ...

FileNotFoundError: Could not find module
Всем привет, написал программу, она создает и декодирует qrcode, все это на граф интерфейса благодаря tkinter. Программа работает в формате...

Global name FileNotFoundError шы not defined
собственно вопрос имеется класс class Encoder(object): def __init__(self, source_file, destination_file, key): ...

FileNotFoundError: [Errno 2] No such file or directory:
Помогите исправить ошибку

FileNotFoundError: [Errno 2] No such file or directory: 'welcome.webp'
Бот работает со 2-ой функцией нормально, а с 1-ой возникает проблема: FileNotFoundError: No such file or directory: 'welcome.webp' ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru