Python 在argparse中处理带分隔符的字符串
我需要将带分隔符的字符串作为参数传递给python脚本。所以,我用Python 在argparse中处理带分隔符的字符串,python,argparse,Python,Argparse,我需要将带分隔符的字符串作为参数传递给python脚本。所以,我用 parser.add_argument('--filter', default=None, nargs='*', action="append") 脚本的输入可以是以下任一项: process.py --filter include:a.txt,b.txt exclude:c.txt, d.txt process.py --filter a.txt => This should be considered as in
parser.add_argument('--filter', default=None, nargs='*', action="append")
脚本的输入可以是以下任一项:
process.py --filter include:a.txt,b.txt exclude:c.txt, d.txt
process.py --filter a.txt => This should be considered as include:a.txt
process.py --filter include:b.txt --filter exclude:d.txt
process.py --filter exclude:c.txt --filter b.txt
文件a.txt、b.txt、c.txt和d.txt包含一些带有正则表达式模式的字符串
我需要根据关键字(包括/排除)筛选报告。在上面的前两种情况下,过滤后只需要生成一个报告,而在第三种和第四种情况下需要生成两个报告。因此,我需要将给定的输入存储为
Case 1:
filter1 => include => a.txt, b.txt
exclude => c.txt, d.txt
Case 2:
filter1 => include => a.txt
Case 3:
filter1 => include => b.txt
filter2 => exclude => d.txt
Case 4:
filter1 => exclude => c.txt
filter2 => include => b.txt
如何实现存储上述定义的值
谢谢。通过你的论证,我得到了命令行
Namespace(filter=[['include:a.txt,b.txt', 'exclude:c.txt,', 'd.txt']])
Namespace(filter=[['a.txt']])
Namespace(filter=[['include:b.txt'], ['exclude:d.txt']])
Namespace(filter=[['exclude:c.txt'], ['b.txt']])
这些值紧密地反映了解析器在sys.argv[1://code>中得到的内容
处理过滤器
列表应该很容易,以生成所需的值。您不需要在argparse
中执行更多操作。尝试在argparse
中执行此操作不会节省任何精力或逻辑
这就是说,我可以想出一些使逻辑更简单的方法
消除排除:c.txt、d.txt
中的空格。或者在子字符串周围加引号
删除隐式的包含要求
定义两个选项,--include
和--exclude
选项(以及处理隐式“include”的位置选项),而不是一个--filter
选项:
生产
'a.txt' =>
Namespace(exclude=[], include=[['a.txt']])
'--include a.txt b.txt --exclude c.txt d.txt' =>
Namespace(exclude=[['c.txt', 'd.txt']], include=[['a.txt', 'b.txt'], []])
解析
过滤器
值的简单函数:
def decode(values):
filters = []
for f in values:
filter = {}
for text in f:
words = text.split(':')
if len(words)==1:
words = ['include']+words
files = words[1].split(',')
if words[0] == 'include':
filter['include'] = files
elif words[0] == 'exclude':
filter['exclude'] = files
else:
filter['unknown'] = files
filters.append(filter)
return filters
它可以用作:
args = parser.parse_args()
filters = decode(args.filter)
为您的4个案例制作:
[{'exclude': ['c.txt', 'd.txt'], 'include': ['a.txt', 'b.txt']}]
[{'include': ['a.txt']}]
[{'include': ['b.txt']}, {'exclude': ['d.txt']}]
[{'exclude': ['c.txt']}, {'include': ['b.txt']}]
我认为唯一遗漏的是处理exclude:c.txt,d.txt
中的空格。为此,它生成:[{'exclude':['c.txt',''],'include':['d.txt']}]
。也就是说,它将其解释为隐式的include
理论上,它可以包含在
--filter
参数的自定义操作中,但我认为它在解析后也可以正常工作。确实要将过滤器设置为--filter1--filter2等吗?或者一个过滤器列表会更好吗?无论是哪种方式,我都建议研究一下:本节底部有一个自定义操作的示例,这应该使您能够做您想做的事情,通过各种输入查看您在sys.argv
中得到了什么。你可能需要更多的报价。
[{'exclude': ['c.txt', 'd.txt'], 'include': ['a.txt', 'b.txt']}]
[{'include': ['a.txt']}]
[{'include': ['b.txt']}, {'exclude': ['d.txt']}]
[{'exclude': ['c.txt']}, {'include': ['b.txt']}]