2

如何在 python configparser 中的值中添加分号?

蟒蛇 - 2.7

我有一个 python 配置解析器,其中键是 url,值是令牌。作为 url 的键包含 :, -, ? 和其他各种字符同样适用于价值。正如您从上面的问题中看到的那样,值部分中的特殊字符似乎很好,但键似乎并不好。

对此我能做些什么吗?我的替代方案是解析为 json 文件并手动手动写入/读取它。

例如,如果您在我得到后运行以下程序

cp = ConfigParser.ConfigParser()
cp.add_section("section")
cp.set("section", "http://myhost.com:9090", "user:id:token")
cp.set("section", "key2", "value2")
with open(os.path.expanduser("~/test.ini"), "w") as f:
    cp.write(f)

cp = ConfigParser.ConfigParser()
cp.read(os.path.expanduser("~/test.ini"))
print cp.get("section", "key2")
print cp.get("section", "http://myhost.com:9090")

该文件如下所示

[section]
http://myhost.com:9090 = user:id:token
key2 = value2

我得到了例外ConfigParser.NoOptionError: No option 'http://myhost.com:9090' in section: 'section'

4

5 回答 5

4

ConfigParser在 Python 2.7 上被硬编码以识别冒号和等号作为键和值之间的分隔符。当前的 Python 3configparser模块允许您自定义分隔符。可在https://pypi.python.org/pypi/configparser获得 Python 2.6-2.7 的反向移植

于 2013-07-30T13:27:15.833 回答
1
  1. 拆分您的 URL 协议、基础和端口,即 : 之后的位并将它们用作辅助键
  2. 将 : 替换为允许的内容,反之亦然,可能使用 0xnn 表示法或类似的东西
  3. 您可以使用基于 URL 的值,例如 URL 值的 MD5 作为键。
于 2013-07-30T12:51:33.607 回答
1

我通过将使用的正则表达式更改ConfigParser为仅用=作分隔符解决了类似的问题。

这已经在 Python 2.7.5 和 3.4.3 上进行了测试

import re
try:
    # Python3
    import configparser
except:
    import ConfigParser as configparser

class MyConfigParser(configparser.ConfigParser):
    """Modified ConfigParser that allow ':' in keys and only '=' as separator.
    """
    OPTCRE = re.compile(
        r'(?P<option>[^=\s][^=]*)'          # allow only = 
        r'\s*(?P<vi>[=])\s*'                # for option separator           
        r'(?P<value>.*)$'                   
        )
于 2017-05-15T11:50:24.680 回答
0

http://bugs.python.org/issue16374

分号是 2.7 中的内联注释分隔符

于 2015-01-23T21:04:00.080 回答
0

您可以使用以下解决方案来执行您的任务

将所有冒号替换为特定的特殊字符,例如“_”或“-”,这些字符在ConfigParser

代码:

from ConfigParser import SafeConfigParser

cp = SafeConfigParser()
cp.add_section("Install")
cp.set("Install", "http_//myhost.com_9090", "user_id_token")
with open("./config.ini", "w") as f:
    cp.write(f)

cp = SafeConfigParser()
cp.read("./config.ini")
a = cp.get("Install", "http_//myhost.com_9090")
print a.replace("_",":")

输出:

用户:ID:令牌

于 2015-05-21T10:44:36.860 回答