使用ConfigParser
模块时,我想使用包含cfg文件中设置的多个单词的值。在这种情况下,使用像(example.cfg
):
[GENERAL]
onekey = "value in some words"
我的问题是,在这种情况下,python在使用如下值时将引号附加到字符串:
config = ConfigParser()
config.read(["example.cfg"])
print config.get('GENERAL', 'onekey')
我确信有一个内置功能可以设法仅打印'value in some words'
而不是'"value in some words"'
。这怎么可能?感谢。
答案 0 :(得分:10)
我在the configparser manual中没有看到任何内容,但您可以使用.strip
字符串方法来删除前导和尾随双引号。
>>> s = '"hello world"'
>>> s
'"hello world"'
>>> s.strip('"')
'hello world'
>>> s2 = "foo"
>>> s2.strip('"')
'foo'
如您所见,.strip
如果不以指定的字符串开头和结尾,则不会修改字符串。
答案 1 :(得分:6)
import ConfigParser
class MyConfigParser(ConfigParser.RawConfigParser):
def get(self, section, option):
val = ConfigParser.RawConfigParser.get(self, section, option)
return val.strip('"')
if __name__ == "__main__":
#config = ConfigParser.RawConfigParser()
config = MyConfigParser()
config.read(["example.cfg"])
print config.get('GENERAL', 'onekey')
答案 2 :(得分:3)
对不起,解决方案也是微不足道的 - 我可以简单地留下引号,看起来python只是采取等号的右侧。
答案 3 :(得分:3)
这个问题已经很老了,但至少在2.6中你不需要使用引号,因为空格被保留了。
from ConfigParser import RawConfigParser
from StringIO import StringIO
s = RawConfigParser()
s.readfp(StringIO('[t]\na= 1 2 3'))
s.get('t','a')
> '1 2 3'
这不适用于领先或尾随空格!如果你想保留它们,你需要将它们用引号括起来,按照建议继续。不要使用eval
关键字,因为您将面临巨大的安全漏洞。
答案 4 :(得分:0)
戴维,
正如你所说,你可以把引号从字符串中删除。
对于我正在研究的项目,我希望能够将几乎所有的Python字符串文字表示为我的一些配置选项的值,更多的是我希望能够将它们中的一些作为原始字符串处理文字。 (我希望该配置能够处理\ n,\ x1b等内容。)
在那种情况下,我使用了类似的东西:
def EvalStr(s, raw=False):
r'''Attempt to evaluate a value as a Python string literal or
return s unchanged.
Attempts are made to wrap the value in one, then the
form of triple quote. If the target contains both forms
of triple quote, we'll just punt and return the original
argument unmodified.
Examples: (But note that this docstring is raw!)
>>> EvalStr(r'this\t is a test\n and only a \x5c test')
'this\t is a test\n and only a \\ test'
>>> EvalStr(r'this\t is a test\n and only a \x5c test', 'raw')
'this\\t is a test\\n and only a \\x5c test'
'''
results = s ## Default returns s unchanged
if raw:
tmplate1 = 'r"""%s"""'
tmplate2 = "r'''%s'''"
else:
tmplate1 = '"""%s"""'
tmplate2 = "'''%s'''"
try:
results = eval(tmplate1 % s)
except SyntaxError:
try:
results = eval(tmplate2 %s)
except SyntaxError:
pass
return results
...我认为它会处理任何不包含三重单引号和三重引号字符串的内容。
(那个角落的情况超出了我的要求)。
这个代码在SO上有一个奇怪的地方;语法荧光笔似乎被混淆了 我的docstring是 raw 字符串的事实。这对于让doctest为这个特定的功能感到高兴是必要的。)
答案 5 :(得分:0)
我不得不面对同样的问题。我更喜欢使用普通词典,而不是configparser对象。所以首先我读取.ini
文件,然后将configparser对象转换为dict,最后我从字符串值中删除引号(或撇号)。这是我的解决方案:
<强> preferences.ini 强>
[GENERAL]
onekey = "value in some words"
[SETTINGS]
resolution = '1024 x 768'
<强> example.py 强>
#!/usr/bin/env python3
from pprint import pprint
import preferences
prefs = preferences.Preferences("preferences.ini")
d = prefs.as_dict()
pprint(d)
<强> preferences.py 强>
import sys
import configparser
import json
from pprint import pprint
def remove_quotes(original):
d = original.copy()
for key, value in d.items():
if isinstance(value, str):
s = d[key]
if s.startswith(('"', "'")):
s = s[1:]
if s.endswith(('"', "'")):
s = s[:-1]
d[key] = s
# print(f"string found: {s}")
if isinstance(value, dict):
d[key] = remove_quotes(value)
#
return d
class Preferences:
def __init__(self, preferences_ini):
self.preferences_ini = preferences_ini
self.config = configparser.ConfigParser()
self.config.read(preferences_ini)
self.d = self.to_dict(self.config._sections)
def as_dict(self):
return self.d
def to_dict(self, config):
"""
Nested OrderedDict to normal dict.
Also, remove the annoying quotes (apostrophes) from around string values.
"""
d = json.loads(json.dumps(config))
d = remove_quotes(d)
return d
第d = remove_quotes(d)
行负责删除引号。评论/取消注释此行以查看差异。
<强>输出:强>
$ ./example.py
{'GENERAL': {'onekey': 'value in some words'},
'SETTINGS': {'resolution': '1024 x 768'}}
答案 6 :(得分:0)
def config_reader():
"""
Reads configuration from configuration file.
"""
configuration = ConfigParser.ConfigParser()
configuration.read(__file__.split('.')[0] + '.cfg')
config = {}
for section in configuration.sections():
config[section] = {}
for option in configuration.options(section):
config[section][option] = (configuration.get(section, option)).strip('"').strip("'")
return config
答案 7 :(得分:-3)
在这种情况下,最简单的解决方案是&#34; eval()&#34;。
但是,你可能会担心安全问题。但你仍然可以通过以下方式来做到这一点:
def literal_eval(node_or_string):
"""
Safely evaluate an expression node or a string containing a Python
expression. The string or node provided may only consist of the following
Python literal structures: strings, numbers, tuples, lists, dicts,booleans,
and None.
"""
作为样本:
import ast
config = ConfigParser()
config.read(["example.cfg"])
print ast.literal_eval(config.get('GENERAL', 'onekey'))
# value in some words