#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 это отвечает на ваш вопрос?