[英]Python 2.x - ConfigParser stripping blank lines in multiline value
[英]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.