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

9
我正在编写一个Python程序,用于解析一些输入行中的字段。我希望让用户从命令行输入字段分隔符作为选项。我使用optparse来实现这一点。我遇到了一个问题,就是输入类似\t的内容会按照字面意义进行分隔,而不是按照制表符进行分隔,而我需要的是后者。我相信这是一个Python的问题,而不是shell的问题,因为我已经尝试了各种引号、反斜杠和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 设置为默认值并忘记它,但我想知道如何处理这种问题。)

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

这不是我想要的。
4个回答

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

0

快速而不太规范的方法是使用eval,像这样:

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

额外的空字典存在是为了防止意外覆盖您的程序。


0

从脚本内部解决它:

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

你可以调整正则表达式以匹配更多的转义字符(\n,\r等)

解决Python之外的问题的另一种方法:

当你从shell中调用你的脚本时,像这样执行:

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

^V 意味着“按下 Ctrl+V”

然后按下普通的 Tab 键

这将正确地传递 Tab 字符到您的 Python 脚本中;


0

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' 模块处理选项,而不是通过后处理解析结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接