Почему fileinput не выдает ошибку при неправильном пути?

#python #file-io

#python #file-io

Вопрос:

 import fileinput
def main()
    try:
        lines = fileinput.input()
        res = process_lines(lines)

        ...more code
    except Exception:
        print('is your file path bad?')

if __name__ == '__main__':
    main()
  

Когда я запускаю этот код с неправильным путем, он не выдает ошибку, но в документах говорится, что ошибка ОС будет выдана при наличии ошибки ввода-вывода. Как мне тогда проверить наличие неверных путей?

Комментарии:

1. ошибка выдается при попытке прочитать / повторить результат input() . Может быть, функция process_lines скрывает ошибку?

Ответ №1:

fileinput.input() возвращает итератор, а не специальный список:

 In [1]: fileinput.input()
Out[1]: <fileinput.FileInput at 0x7fa9bea55a50>
  

Правильное использование этой функции выполняется с помощью for цикла:

 with fileinput.input() as files:
    for line in files:
        process_line(line)
  

или с помощью преобразования в список:

 lines = list(fileinput.input())
  

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

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

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


Что касается проверки правильности пути или нет:

Как только вы перейдете к файлу, который не существует, итератор выдаст исключение:

 # script.py

import fileinput

with fileinput.input() as files:
    for line in files:
        print(repr(line))
  
 $ echo abc > /tmp/this_exists
$ echo xyz > /tmp/this_also_exists
$ python script.py /tmp/this_exists /this/does/not /tmp/this_also_exists
  
 'abcn'
Traceback (most recent call last):
  File "/tmp/script.py", line 6, in <module>
    for line in files:
  File "/home/mrmino/.pyenv/versions/3.7.7/lib/python3.7/fileinput.py", line 252, in __next__
    line = self._readline()
  File "/home/mrmino/.pyenv/versions/3.7.7/lib/python3.7/fileinput.py", line 364, in _readline
    self._file = open(self._filename, self._mode)
FileNotFoundError: [Errno 2] No such file or directory: '/this/does/not'
  

Комментарии:

1. Итак, как я могу определить, является ли это неправильным путем к файлу или нет?

2. @TheRealFakeNews это отвечает на ваш вопрос?