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

|| 我正在制作一个Python程序,它将解析某些输入行中的字段。我想让用户从命令行输入字段分隔符作为选项。我正在使用
optparse
进行此操作。我遇到了这样的问题,即输入
\\t
会在
\\t
而不是选项卡上按字面意义分开,这正是我想要的。我非常确定这是Python而不是Shell,因为我已经尝试了所有可以想到的引号,反斜杠和
t
\的组合。 如果我能得到
optparse
而不是
raw_input
来将参数设为普通输入(是否有这样的事情?),我认为这会起作用。但是我不知道该怎么做。 我还尝试了各种替换和正则表达式技巧,将字符串从两个字符ѭ6转换为一个字符选项卡,但没有成功。 例如,
input.txt
是:
field 1[tab]field\\t2
(注意:“ 9”是制表符,“ 10”是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\'
    
快速而肮脏的方法是将它“ѭ15”,如下所示:
eval(options.delimiter, {}. {})
那里有多余的空字典,以防止意外破坏程序。     
从脚本中解决它:
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脚本;     
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”模块而不是通过对解析结果进行后处理来处理选项的优势。     

要回复问题请先登录注册