用argparse处理包含"或'的输入
我写了一个简单的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)
这样的方式只能大致匹配你的输入)