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

问题描述:

我正在制作一个Python程序,用于解析某些输入行中的字段。我想让用户在命令行中输入字段分隔符作为选项。我使用optparse来做到这一点。我遇到的问题是,输入类似\t的东西将在字面上分开\t,而不是在选项卡上,这正是我想要的。我很确定这是一个Python的东西,而不是shell,因为我已经尝试了所有我能想到的引号,反斜杠和t的组合。将元字符作为参数从命令行传递给Python

如果我可以得到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的默认,而忘记了它,但我想知道如何处理这种类型的问题。)

$ parseme.py -f input.txt -d '\t' 
field 1[tab]field 
\t 

这不是我想要的。

>>> r'\t\n\v\r'.decode('string-escape') 
'\t\n\x0b\r' 
+0

不错和干净的解决方案 – user237419 2011-04-22 08:22:31

+0

谢谢,这工作得很好。 – Darlingtonia 2011-05-05 07:03:33

快速和肮脏的方式是为eval,就像这样:

eval(options.delimiter, {}. {}) 

额外的空类型的字典在那里,以防止你的程序的意外重挫。

从脚本中解决它:

options.delimiter = re.sub("\\\\t","\t",options.delimiter) 

可以适应再要匹配更多的转义字符(\ n,\ r等)

另一种方式来解决外蟒蛇问题:

当你调用从外壳脚本,

像这样做:

parseme.py -f input.txt -d '^V<tab>' 

^V的意思是 “按Ctrl + V”

然后按正常的tab键

这将制表符正确地传递给你的Python脚本;

callback选项是处理棘手的情况下获得良好的方法:

parser.add_option("-d", "--delimiter", action="callback", type="string", 
        callback=my_callback, default='\t') 

与相应的功能(之前定义解析器,然后):

def my_callback(option, opt, value, parser): 
    val = value 
    if value == '\\t': 
     val = '\t' 
    elif value == '\\n': 
     val = '\n' 
    parser.values.delimiter = val 

你可以通过命令行检查这个工作:python test.py -f test.txt -d \t(没有引用\t,他们没用)。

它具有通过“optparse”模块处理选项的优点,而不是通过后处理解析结果。