将元字符作为参数从命令行传递给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'
快速和肮脏的方式是为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”模块处理选项的优点,而不是通过后处理解析结果。
不错和干净的解决方案 – user237419 2011-04-22 08:22:31
谢谢,这工作得很好。 – Darlingtonia 2011-05-05 07:03:33