9

我正在制作一个 Python 程序,它将解析一些输入行中的字段。我想让用户从命令行输入字段分隔符作为选项。我optparse用来做这个。我遇到了这样的问题,输入类似的\t内容会逐字分开\t,而不是在选项卡上,这就是我想要的。我很确定这是 Python 的东西,而不是 shell,因为我已经尝试了所有t我能想到的引号、反斜杠和 's 的组合。

如果我可以optparse让论点成为简单的输入(有这样的事情吗?)而不是raw_input,我认为这会起作用。但我不知道该怎么做。

我还尝试了各种替换和正则表达式技巧将字符串从两个字符"\t"转换为一个字符选项卡,但没有成功。

示例,其中input.txt是:

field 1[tab]field\t2

(注:[tab]是制表符,field\t2是8个字符的字符串)

解析.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

4 回答 4

7
>>> r'\t\n\v\r'.decode('string-escape')
'\t\n\x0b\r'
于 2011-04-22T08:13:25.657 回答
0

快速而肮脏的方法是这样eval做,如下所示:

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

额外的空字典可以防止意外破坏您的程序。

于 2011-04-22T07:48:00.687 回答
0

从您的脚本中解决它:

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

您可以调整 re 以匹配更多转义字符(\n、\r 等)

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

当你从 shell 调用你的脚本时,这样做:

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

^V 表示“按 Ctrl+V”

然后按正常的tab键

这将正确地将制表符传递给您的 python 脚本;

于 2011-04-22T08:11:30.540 回答
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”模块处理选项,而不是通过对解析结果进行后处理。

于 2011-04-22T08:43:24.553 回答