对于我的程序,我需要解析一个.xml文件和一个.ttf文件。我不想通过键入参数的ID来打扰用户,但我宁愿接受已解析的数据,然后根据.extension决定哪个文件是哪个文件。 argparser是否可以做类似
的操作def my_func(n):
if n<=0:
return False
elif n==1 or n==2:
return True
while n:
if n==2:
return True
elif n%2:
return False
else:
n//=2
# At the end of your loop, n will be zero, indicating that it was a power of 2
return True
以未知顺序,并在收到文件路径后决定?我只需要知道如何在不中断的情况下将此类信息解析为Python程序。谢谢
答案 0 :(得分:0)
在收到用户的输入后,假设他们的路径在var1
和var2
中,只需使用var1.split(".")[1]
和var2.split(".")[1]
检查扩展名(它们返回在该点之后的字符串,这是您的文件扩展名),并执行类似的操作(假设用户没有将两个文件扩展名相同)
if var1.split(".")[1] == "xml"
xml_file=var1
ttf_file=var2
else:
xml_file=var2
ttf_file=var1
答案 1 :(得分:0)
感谢拉尔夫在我提出问题的问题下的评论
args = sys.argv[1:] #the first one is path of your python script
if len(args) > 3:
print('wrong')
for i in args:
if i.endswith('.xml'):
xml_path = i
if i.endswith('.ttf'):
font_path = i
答案 2 :(得分:0)
您可以使用自定义操作。对delattr
的调用让我感到有些讨厌,但保持名称空间整洁。
class InputFileAction(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
if values.endswith(".ttf"):
dest = "ttf_file"
elif values.endswith(".xml"):
dest = "xml_file"
else:
raise argparse.ArgumentTypeError("File must have .ttf or .xml extension")
setattr(namespace, dest, values)
delattr(namespace, self.dest)
p = argparse.ArgumentParser()
p.add_argument("input1", action=InputFileAction)
p.add_argument("input2", action=InputFileAction)
一些例子:
>>> p.parse_args(["foo.ttf", "foo.xml"])
Namespace(ttf_file='foo.ttf', xml_file='foo.xml')
>>> p.parse_args(["foo.xml", "foo.ttf"])
Namespace(ttf_file='foo.ttf', xml_file='foo.xml')