繁体   English   中英

如何为Python 2.x ConfigParser指定unicode和其他转义文字

[英]How to specify a unicode and other escaped literals to Python 2.x ConfigParser

我正在使用ConfigParser来读取配置文件。

我希望配置文件保持ASCII / ANSI,但我想在其中一个配置选项中传递一个unicode文字(在python字面意义上):

[flatfile]
datafile_encoding = utf16
delimiter= u'\u2016'
# also this should be parsable too:
# delimiter= '\t'

我的结果是:

import ConfigParser, io

config = ConfigParser.RawConfigParser(allow_no_value=True)
config.read(filename)

flatfile_config = {}
for item in config.items('flatfile'):
    flatfile_config[item[0]] = item[1]

assert flatfile_config['delimiter'] == u'\u2016'
#assert flatfile_config['delimeter'] == '\t'

f = io.open(datafile, mode='r', encoding=flatfile_config['datafile_encoding'])
row = f.readline()
row_split = row.strip('\n').split(flatfile_config['delimiter'])

我不想创建一个in-python查找表来处理配置文件分隔符选项中的文字值(因为我正在使用配置文件)。

如果您希望以与Python相同的方式评估任何Python文本,则函数ast.literal_eval执行您想要的操作:

>>> s = r"""u'\u2016'"""
>>> print s
u'\u2016'
>>> print ast.literal_eval(s)
‖

如果你想确保它是一个字符串或 Unicode的文字,所以用户不能混淆你delimiter=42 ,你最好的办法是literal_eval然后键入检查:

val = ast.literal_eval(s)
if not isinstance(val, basestring):
    raise BadUserError("Why are you giving me {} when I wanted a string?".format(s))

更详细:

安全地评估表达式节点或包含Python表达式的Unicode或Latin-1编码的字符串。 提供的字符串或节点可能只包含以下Python文字结构:字符串,数字,元组,列表,dicts,布尔值和None。

这可以用于安全地评估包含来自不可信来源的Python表达式的字符串,而无需自己解析值。

如果你想知道不信任来源的担心是什么,想象你刚刚使用eval ,它适用于任何Python表达式,我把它放在配置文件中:

delimiter=__import__('os').system('rm -rf /')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM