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())
即仅当您实际迭代此对象时才会打开文件。
虽然我不推荐第二种方式,因为它是counter to the philosophy of how such scripts are supposed to work。
您应该尽可能少地解析输出数据,然后尽快输出。这避免了大输入的问题,如果您的脚本在更大的管道中使用,则可以显着加快处理速度。
关于检查路径是否正确:
一旦您向下迭代到不存在的文件,迭代器就会抛出异常:
# 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
'abc\n'
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'