尝试在argparse中创建一个参数,其中可以输入多个可以读取的文件名。 在这个例子中,我只是试图打印每个文件对象,以确保它正常工作,但我收到错误:
error: unrecognized arguments: f2.txt f3.txt
即可。我怎样才能让它识别所有这些?
我在终端中运行程序并读取多个文件的命令
python program.py f1.txt f2.txt f3.txt
Python脚本
import argparse
def main():
parser = argparse.ArgumentParser()
parser.add_argument('file', nargs='?', type=file)
args = parser.parse_args()
for f in args.file:
print f
if __name__ == '__main__':
main()
我使用nargs='?'
b / c我希望它可以是任意数量的文件。如果我将add_argument
更改为:
parser.add_argument('file', nargs=3)
然后我可以将它们打印成字符串,但我无法使用'?'
答案 0 :(得分:45)
如果您的目标是阅读一个或多个可读文件,可以试试这个:
parser.add_argument('file', type=argparse.FileType('r'), nargs='+')
nargs='+'
将所有命令行参数收集到列表中。还必须有一个或多个参数或将生成错误消息。
type=argparse.FileType('r')
尝试打开每个参数作为阅读文件。如果argparse无法打开文件,它将生成错误消息。您可以使用它来检查参数是否是有效且可读的文件。
或者,如果您的目标是阅读零个或多个可读文件,则只需将nargs='+'
替换为nargs='*'
即可。如果没有提供命令行参数,这将为您提供一个空列表。如果您没有提供任何文件,也许您可能想要打开标准输入 - 如果是这样,只需将default=[sys.stdin]
作为参数添加到add_argument
。
然后处理列表中的文件:
args = parser.parse_args()
for f in args.file:
for line in f:
# process file...
关于nargs的更多信息: https://docs.python.org/2/library/argparse.html#nargs
有关类型的更多信息:https://docs.python.org/2/library/argparse.html#type
答案 1 :(得分:0)
只需要确保至少有一个参数
parser.add_argument('file',nargs='*')