如何解析无法识别的参数?

时间:2019-03-27 18:30:24

标签: python python-3.x argparse

对于我的程序,我需要解析一个.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程序。谢谢

3 个答案:

答案 0 :(得分:0)

在收到用户的输入后,假设他们的路径在var1var2中,只需使用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')