Bri*_*ine 1 php python arrays ini
我已经阅读了这篇文章,并在subscriber.ini中定义了一个数组
[smtp]
subscriber[] = aaa@hotmail.com
subscriber[] = bbb@XX.webmail
subscriber[] = ccc@test.org
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用ConfigParser来读取数组
#!/usr/bin/python
import ConfigParser
CONFIG_FILE = 'subscriber.ini'
config = ConfigParser.ConfigParser()
config.read( CONFIG_FILE )
subscriber = config.get('smtp' , 'subscriber[]' )
print subscriber
Run Code Online (Sandbox Code Playgroud)
它将输出最后一个元素ccc@test.org.但我希望有一个完整的用户名单.
如何从ini文件中获取数组?
Python ConfigParser 不提供此功能。请改用以下内容:
[smtp]
subscriber = aaa@hotmail.com bbb@XX.webmail ccc@test.org
Run Code Online (Sandbox Code Playgroud)
然后在你的脚本中:
subscriber = config.get('smtp' , 'subscriber').split()
Run Code Online (Sandbox Code Playgroud)
此语法subscriber[]自动subscriber生成多个值的列表,通常不是.ini文件的功能,也不是ConfigParser的功能.这是一个特点Zend_Config_Ini.
在Python中,ConfigParserini文件创建一个dict,将每个键映射到其值.如果您有多个值,它将覆盖以前的值.魔术[]后缀毫无意义.
但是,ConfigParser构造函数允许您指定自定义字典类型或工厂,而不是默认值OrderedDict.
一个简单的解决方案是使用defaultdict(list)(或OrderedDefaultDict,其中有文档中的配方)用于底层存储,已经__setitem__(self, key, value)执行self.dd[key].append(value),并正常委托其他所有内容.(或者,如果您愿意,继承defaultdict,覆盖构造函数以传递list给超级,然后只是不要覆盖任何东西__setitem__.)这将使您的所有值成为列表.
你甚至可以做一些hacky,其中只有一次看到的值是单个值,但是如果再次看到相同的名称,它就会成为一个列表.我认为这是一个糟糕的想法(你真的想检查一下你config.get('smtp', 'subscriber[]')决定是否要迭代它的类型吗?),但是如果你想,如何ConfigParse一个文件保留相同键的多个值?说明如何.
然而,重复你正在寻找的确切魔法并不是很难,其中所有键[]都是列表(无论它们出现一次还是多次),其他一切都像普通一样(如果出现则只保留最后一个值)多次).像这样的东西:
class MultiDict(collections.OrderedDict):
def __setitem__(self, key, value):
if key.endswith('[]'):
super(MultiDict, self).setdefault(key, []).append(value)
else:
super(MultiDict, self).__setitem__(key, value)
Run Code Online (Sandbox Code Playgroud)
这显然不会提供在普通.ini文件之上添加的所有扩展功能Zend_Config_Ini.例如,[group : subgroup : subsub]作为组名称不具有任何特殊含义,也不会key.subkey.subsub作为键名称.PHP值TRUE,FALSE,yes,no,而NULL不会被转换到Python值True,False,True,False,和None.数字不会神奇地成为数字.(事实上,这是不是一个功能Zend_Config_Ini,但是PHP的泄漏打字的不良特性.)你必须使用#的意见,而不是随意混合#,;和//.等等.您要添加的任何功能都必须手动添加,就像您执行此功能一样.
正如我在评论中所建议的那样,如果你真的想拥有两个以上的层次结构,那么你可能会选择一种自然无限分层的格式,其中任何值都可以是其他值的列表或字典.
JSON现在无处不在.它可能不像INI那样具有人类可编辑性,但我认为2014年有更多的人比INI熟悉它.它具有巨大的优势,它是标准化格式,Python(2.6+)和PHP(5.2) +)在标准库中附带解析器和漂亮的打印机.
YAML是一种更灵活,人性化的格式.但是您需要使用这两种语言的第三方模块(请参阅YAML网站上的列表).如果你不小心,它也会带来一些安全问题.(请参阅文档中的safe_load朋友PyYAML;大多数其他库具有相似的功能.)
| 归档时间: |
|
| 查看次数: |
5593 次 |
| 最近记录: |