我正在使用 {{player.playerName}}
来获取输入文件列表:
argparse
然而,这为用户传递了import argparse
p = argparse.ArgumentParser()
p.add_argument("infile", nargs='+', type=argparse.FileType('r'), help="copy from")
p.add_argument("outfile", help="copy to")
args = p.parse_args()
的大门,其中源目录可能有数百万个文件,shell扩展可能会超出解析器。我的问题是:
有没有办法禁用shell扩展(*)?
如果没有,是否有办法在输入文件组装成列表之前对输入文件的数量设置上限?
答案 0 :(得分:1)
(1)不,shell扩展是由shell完成的。运行Python时,命令行已经扩展。使用"*"
或'*'
将停用它,但也会在shell上发生。
(2)是的,在代码的早期获得sys.argv
的长度,如果太长则退出。
此外,大多数shell都有扩展的内置限制。
答案 1 :(得分:0)
如果您担心infile
值太多,请不要使用FileType
。
p.add_argument("infile", nargs='+', help="copy from")
只需接受文件名列表即可。这不会让你付出太多代价。然后,您可以根据需要打开和处理尽可能多的文件。
FileType
在解析名称时打开文件。这对于您将在小脚本中立即使用的一些文件来说是可以的。但通常您不希望或不需要立即打开所有这些文件。在现代Python中,我们鼓励您在with context
中打开文件,因此立即关闭(而不是在脚本完成之前一直闲置)。
FileType
处理'-'
,stdin
值。如果无法打开文件,它将发出一个很好的错误报告。但这就是你想要的吗?或者你愿意处理每个文件,跳过坏名字。
整体FileType
是一种便利,但在严肃的应用程序中通常是一个糟糕的选择。
还有其他需要担心的问题 - outfile
是(可能)很长的文件列表中的最后一个,' +'输入1和1。 argparse
接受了,但它可能会带来问题。例如,如果用户忘记提供' outfile&#39 ;?然后最后一个输入文件将用作outfile。该错误可能导致无意中重写文件。使用'-o','--outfile',
可能更安全,使用户明确标记outfile。用户可以先给它,所以他不会忘记。
一般来说' +'和' *'最后使用时,定位是最安全的。