我正在尝试在Python脚本上创建验证,该脚本应从命令行获取文件。很像:
./script.py < somefilename
正如您所看到的,文件名可能没有任何类型的扩展名。这也应该适用于多个平台,最好是。
在验证方面,它应该能够保存由换行符\n
分隔的字符串行。
这带来了两个我无法解决的问题:
在我目前的表单中,我使用argparse来解析标志,但由于需求已经改变,我需要使用更多的动态(他们说),我实现<
的解决方案风笛手”。使用stdin
。
但是使用stdin
会产生问题,因为我无法验证该文件是否存在;如果没有正确的扩展名,用户可能会输入textfile
,这会显示
'没有这样的文件或目录'
我想要做的是创建可以保留文本(例如“.txt”)的可能扩展名列表,并检查是否存在具有该扩展名的文件,以防输入的文件不存在不存在于当前文件夹中。只是为了让它更强大...
使用stdin时,这似乎非常困难(如果不是不可能),因为您无法在多个平台上正确连接文件名。
我也尝试过使用fileinput,但在我读完文件之前我不能使用fileinput.filename()
:
for line in fileinput.input():
print fileinput.filename()
有没有人对如何在上述示例(./script.py < somefilename
)上添加强大的文件验证有任何建议?
甚至可以在多个平台上使用?
答案 0 :(得分:2)
我建议回到argparse
并检查是否存在输入文件。这个功能:
import os
def check_file(filename):
possible_extensions = ('', '.txt', '.dat')
for e in possible_extensions:
if os.path.isfile(filename + e):
return filename + e
else:
return None
如果存在该名称下的文件,将返回其参数,否则它将测试可能的扩展并返回第一个匹配,如果未找到匹配则返回None
。
答案 1 :(得分:2)
您的程序无法确定shell如何调用它,因此这两个命令与您的程序的观点无法区分:
$ ./script.py < somefilename
和
$ cat somefilename | script.py
如果文件somefilename
不存在,则调用者将收到类似No such file or directory
的shell错误,并且./script.py
甚至不会被shell调用,所以原则上它没有机会验证任何东西。
如果您尝试实现的目标是验证程序的参数,则可以通过使用{{将输入文件传递给它来始终为此提供其他方式1}}切换:-i
,并验证文件./script.py -i somefilename
是否存在。为了达到理想的多功能性,程序还可以提供一个不带somefilename
开关的选项,假设应该从-i
读取文件。