我是新手在python中使用arparse模块,我希望有人可以帮助我解决以下问题。 我使用以下命令将可变数量的文件指定为输入:
parser = argparse.ArgumentParser(description='Get Files')
parser.add_argument('-i','--input', help='Input file(s)',required=True, nargs='+')
args = parser.parse_args()
我想指定一个可变数量的文件输入,每个输入的关联值为1或2,我不知道如何执行此操作。
我希望程序能够运行,以便我的命令行输入为:
MyProgram.py -i myfile.txt 2 secondfile.txt 1 ...
一旦我有这个工作,我如何调用程序中的每个文件?
答案 0 :(得分:1)
您的代码正常运行。您可以使用grouper recipe一次循环args.input
两个项目:
import argparse
parser = argparse.ArgumentParser(description='Get Files')
parser.add_argument('-i','--input', help='Input file(s)',required=True, nargs='+')
args = parser.parse_args()
for filename, num in zip(*[iter(args.input)]*2):
print(filename, num)
# with open(filename) as f:
# ....
产量
('myfile.txt', '2')
('secondfile.txt', '1')
答案 1 :(得分:1)
对于每对输入,-i
一次会更清楚,如下所示:
parser.add_argument("-i", "--input", nargs=2, action='append')
现在,args.input
将是一个列表列表,如此
[ ['myfile.txt', 2], ['secondfile.txt', 1] ]
它确实需要为用户输入更多内容,因为-i
需要为每个文件显式输入一次。
另一种选择是将每个参数指定为单个单词,然后使用type
参数解析单词。我也会摆脱-i
参数,并使用位置参数来获取所需的“选项”。
parser.add_argument('input', nargs='+', type=lambda x: x.rsplit(":", 2))
用法是
myscript.py myfile.txt:1 secondfile.txt:2 ...
答案 2 :(得分:0)
最好使用sys.argv
作为
import sys, os
variables = list()
filenames = list()
if( len( sys.argv ) > 1 ):
if( sys.argv[1] == '-i' )or( sys.argv[1] == '--input' ):
N = len( sys.argv[1:] )
for i in range( 2, N, 2 ):
variables.append( int( sys.argv[i] ) )
filenames.append( sys.argv[i+1] )
for file in filenames:
# do something here
os.system( 'less '+file )
我没有对此进行测试,但这应该可行。
答案 3 :(得分:0)
试试这个:
parser = argparse.ArgumentParser(description='Get Files')
parser.add_argument('-i','--input', help='Input file(s)',
required=True, nargs='+', action='append')
args = parser.parse_args()