从命令行将元字符作为参数传递给Python
$ parseme.py -f input.txt -d '\t'
field 1[tab]field
\t
我正在写一个Python程序,用来解析一些输入行中的字段。我想让用户可以从命令行输入字段分隔符。为此,我使用了optparse
这个工具。不过,我遇到了一个问题,就是如果输入像\t
这样的内容,它会把\t
当作字面意思来处理,而不是把它当作一个制表符,这正是我想要的。我觉得这应该是Python的问题,而不是命令行的问题,因为我试过各种组合的引号、反斜杠和t
,但都没有成功。
如果我能让optparse
接受普通的输入(有没有这种东西呢?)而不是raw_input
,我觉得这样就能解决问题。但我完全不知道该怎么做。
我还尝试过各种替换和正则表达式的技巧,想把两个字符的"\t"
转换成一个字符的制表符,但都没有成功。
举个例子,假设input.txt
的内容是:
field 1[tab]field\t2
(注意:[tab]
是一个制表符,而field\t2
是一个8个字符的字符串)
parseme.py:
#!/usr/bin/python
from optparse import OptionParser
parser = OptionParser()
parser.add_option("-d", "--delimiter", action="store", type="string",
dest="delimiter", default='\t')
parser.add_option("-f", dest="filename")
(options, args) = parser.parse_args()
Infile = open(options.filename, 'r')
Line = Infile.readline()
Fields = Line.split(options.delimiter)
print Fields[0]
print options.delimiter
Infile.close()
这样我得到的结果是:
$ parseme.py -f input.txt
field 1
[tab]
嘿,太好了,默认设置正常工作了。(是的,我知道我可以把\t
设为默认值就行,但我想知道如何处理这种问题。)
这不是我想要的结果。
4 个回答
0
从你的脚本内部解决这个问题:
options.delimiter = re.sub("\\\\t","\t",options.delimiter)
你可以调整上面的正则表达式,以匹配更多的转义字符(比如 \n、\r 等等)。
还有一种在 Python 之外解决这个问题的方法:
当你从命令行调用你的脚本时,可以这样做:
parseme.py -f input.txt -d '^V<tab>'
^V 的意思是“按下 Ctrl+V”。
然后再按一下普通的 Tab 键。
这样就能正确地将 Tab 字符传递给你的 Python 脚本了。
0
一种简单粗暴的方法就是用 eval
来执行,像这样:
eval(options.delimiter, {}. {})
这些额外的空字典是为了防止不小心覆盖你程序里的东西。
7
>>> r'\t\n\v\r'.decode('string-escape')
'\t\n\x0b\r'
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。