我有一个脚本需要接受一个文件名和一组键值对。这组键值对并没有被定义,它们取决于传入的文件。
例如:
Script.py file1 bob=1 sue=2 ben=3 # file 1 needs bob, sue, and ben
Script.py file2 mel=1 gorge=3 steve=3 # file 2 needs mel, gorge, and steve
我能否使用argparse/optparse实现这个功能或者我需要编写自己的解析器?
我有一个脚本需要接受一个文件名和一组键值对。这组键值对并没有被定义,它们取决于传入的文件。
例如:
Script.py file1 bob=1 sue=2 ben=3 # file 1 needs bob, sue, and ben
Script.py file2 mel=1 gorge=3 steve=3 # file 2 needs mel, gorge, and steve
我能否使用argparse/optparse实现这个功能或者我需要编写自己的解析器?
这应该很容易自己解析。使用辅助库可能会因不知道键而变得复杂。文件名在sys.argv [1]中。您可以使用以“=”字符为分隔符的字符串列表构建字典。
import sys
filename = sys.argv[1]
args = dict([arg.split('=', maxsplit=1) for arg in sys.argv[2:]])
print filename
print args
输出:
$ Script.py file1 bob=1 sue=2 ben=3
file1
{'bob': '1', 'ben': '3', 'sue': '2'}
这就是要点了,但你可能需要更强大的解析方式来解析键值对,而不仅仅是拆分字符串。此外,在尝试提取文件名之前,请确保sys.argv
中至少有两个参数。
dict(arg.split('=') for arg in sys.argv[2:])
- kennytmparser = argparse.ArgumentParser(description='Test dictionary as args')
parser.add_argument("file")
parser.add_argument("dictionary", nargs='*')
args = parser.parse_args()
print args
print args.dictionary
print dict([x.split('=') for x in args.dictionary])
print args.dictionary.__class__
- David Justimport optparse
import json
parser = optparse.OptionParser()
parser.add_option("-t", "--test", dest="test", action="store", type="string")
options, _ = parser.parse_args()
my_dict = json.loads(options.test)
print my_dict['key1']
然后这样使用:
python test.py -t "{\"key1\":\"value1\",\"key2\":\"value2\"}"
这将输出"value1"
这里是一个例子:
# runline argument is : ./filename fname=sameer sname=ali age=29
import sys
l = sys.argv[1:]
print(l)
l = ['fname=sameer', 'sname=ali', 'age=29']
l = ['名字=萨米尔','姓氏=阿里','年龄=29']
for i in l:
runarg = i.split('=')
d[runarg[0]] = runarg[1]
print(d)
{'fname': 'sameer', 'sname': 'ali', 'age': '29'}
print(sys.argv[1:]
ouput: ['fname=sameer', 'sname=ali', 'age=29']
newlist = [x.split('=') for x in l] print(newlist)
新列表 = [x.split('=') for x in l] 打印新列表output: [['fname', 'sameer'], ['sname', 'ali'], ['age', '29']]
新字典 = dict(新列表)
print(新字典)
output: {'fname': 'sameer', 'sname': 'ali', 'age': '29'}