用argparse处理包含"或'的输入

2 投票
1 回答
623 浏览
提问于 2025-04-17 05:15

我写了一个简单的Python脚本,可以在ASCII和Unicode之间转换。这个脚本通过argparse来获取输入,所以输入内容需要用引号括起来,比如说:./Converter.py -a "there's my friend"。脚本会输出用逗号分隔的Unicode值。

当然,输入中的'会导致问题,我知道可以在'前面加个\来转义它;但是出于某种原因,这样做会导致逗号没有被添加。例如:

./Convert.py "\"hi\""

输出结果:

34104, 105, 34

如你所见,34和104之间应该有一个逗号和一个空格。这段代码是:

def CharCode(text):
    print "Unicode values are:",
    length = len(text) 
    for letter in text: 
            Unicode_values = ord(letter) 
            sys.stdout.write(str(Unicode_values)) 
            if letter != text[-1]: 
                    sys.stdout.write(', ')
    sys.stdout.write('\r\n') 

如果我去掉这个

if letter != text[-1]: 

这样就能解决问题,但这样会在Unicode值字符串的最后加一个逗号,我并不想要这个。

所以我的问题是:a) 我该如何防止这种情况发生?b) 有没有更好的方法来处理这种输入?比如说,使用raw_input会不会更好?

非常感谢你的帮助!

1 个回答

3

你的条件

if letter != text[-1]: 

是说当最后一个字符不等于最后一个字符的值时,就写一个逗号和空格。在这个情况下,'(你的第一个字符)和'(你的最后一个字符)是同一个字符。你应该把条件改成检查它确实是最后一个字符,而不是检查这个字符和最后一个字符是否相同。你可以这样做:

for i, letter in enumerate(text):
    #stuff
    if i < len(text) - 1:
        sys.stdout.write(', ')

但更好的方法可能是使用一个连接的方法:

print u', '.join([str(value) for value in unicode_values])

此外,如果你不想用引号让你的命令行把输入作为一个参数传给你的脚本,argparse有 nargs 选项(文档),比如 '+' 可以收集所有存在的参数。不过,你仍然需要对想要的引号进行转义,并且你需要对这些参数之间的空格做一些假设。(像 ' '.join(args) 这样的方式只能大致匹配你的输入)

撰写回答