从命令行将元字符作为参数传递给Python

9 投票
4 回答
3566 浏览
提问于 2025-04-16 16:13
$ 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'

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

撰写回答