什么是在python中读取属性文件的快速方法?

时间:2010-10-22 14:26:07

标签: python configuration-files

我有一个格式为

的文件
VarName=Value
.
.

我想将其读入散列,以便H("VarName")将返回值。

什么是快速的方式? (读取一组字符串,将所有字符串拆分为等号,然后将其放入哈希值?

我正在使用python。

10 个答案:

答案 0 :(得分:21)

oneliner回答:

H = dict(line.strip().split('=') for line in open('filename.txt'))

(如果值也包含“=”字符,则可以选择.split()maxsplit=1一起使用

答案 1 :(得分:10)

也许ConfigParser可以帮到你。

答案 2 :(得分:8)

考虑到@ Steven的回答并没有考虑属性文件中的评论和换行符,这个做了:

H = dict(line.strip().split('=') for line in open('file.properties') if not line.startswith('#') and not line.startswith('\n'))  

答案 3 :(得分:7)

d = {}
with open('filename') as f:
    for line in f:
        key, value = line.split('=')
        d[key] = value

编辑: 正如foret所建议的那样,您可以将其更改为

    for line in f:
        tokens = line.split('=')
        d[tokens[0]] = '='.join(tokens[1:])

将处理值中允许等号的情况,但如果名称也可能具有等号,则仍然会失败 - 因为您需要一个真正的解析器。

答案 4 :(得分:3)

答案 5 :(得分:2)

csv module可让您轻松完成此操作:

import csv
H = dict([(row[0], row[1]) for row in csv.reader(open('the_file', 'r'), delimiter='=' )])

答案 6 :(得分:2)

这可能是一个愚蠢的答案,但谁知道它可以帮助你:)。

将文件的扩展名更改为.py,并进行必要的更改:

file.py

VarName="Value"   # if it's a string
VarName_2=1
# and you can also assign a dict a list to a var, how cool is that ?

并将它放在你的包树或sys.path中,现在你可以在脚本中使用它来调用它:

>>> import file
>>> file.VarName
'Value'

为什么我写这个答案呢,因为,这个档案到底是什么?我从来没有看到像这样的conf文件,没有任何部分没有?为什么要创建这样的配置文件?它看起来像一个糟糕的配置文件,应该看起来像Django设置,我更喜欢使用django设置类配置文件,我尽可能。

现在你可以把你的-1放在左边:)

答案 7 :(得分:2)

对于python2,有一个jproperties https://pypi.python.org/pypi/jproperties/1.0.1

对于python2 / 3,有javaproperties http://javaproperties.readthedocs.io/en/v0.1.0/

简单如下:

import os, javaproperties
with open(file, 'rb') as f:
    properties_dict = javaproperties.load(f)

答案 8 :(得分:0)

如果需要以简单的方式读取属性文件中某个部分的所有值:

您的config.properties文件布局:

[SECTION_NAME]  
key1 = value1  
key2 = value2  

你编码:

import configparser

config = configparser.RawConfigParser()
config.read('path_to_config.properties file')

details_dict = dict(config.items('SECTION_NAME'))

这将为您提供一个字典,其中键与配置文件中的键相同及其对应的值。

details_dict becomes

{'key1':'value1', 'key2':'value2'}

现在获取key1的值:

value_1 = details_dict['key1']

将所有内容放在一个只从配置文件中读取该部分的方法中(第一次在程序运行期间调用该方法)。

def get_config_dict():
    if not hasattr(get_config_dict, 'config_dict'):
        get_config_dict.config_dict = dict(config.items('SECTION_NAME'))
    return get_config_dict.config_dict

现在调用上面的函数并获取所需的键值:

config_details = get_config_dict()
key_1_value = config_details['key1'] 

答案 9 :(得分:0)

确定答案中没有其他人提到它,所以我想我会去。如果您正在编写Python并控制您的解释器,也许您可​​以强制使用Jython解释器。

Jython是一个完全用Java实现的Python解释器。您可以轻松获得所有Python标准库,还可以使用所有Java SE库。

我实际上没有执行过以下任何操作(想想它更像psudeo-code而没有异常处理),但是你可以混合搭配Python和Java库,你的代码最终可能会像:

from java.util import Properties
from java.io import File, FileInputStream
import os
javasPropertyObject = Properties()
pathToPropFile = os.path.join('path', 'to', 'property', 'file.properties')
if os.path.isfile(pathToPropFile):
    #this is java.io.File, not Python's file descriptor
    propFile = File(pathToPropFile )
    javasFileInputStreamObject = FileInputStream(propFile)
    javasPropertyObject.load(javasFileInputStreamObject)

    #now we can pull out Java properties as defined by the .property file grammar
    myProp = javasPropertyObject.getProperty('myPropName')

这样的文件有效,而不是简单的split on '='解决方案:

myPropName1:value
myPropName2=value
myPropName3=\
value
#this is a = comment
myPropName4:my \
value
myPropNameWithUnicode=\u0009

缺点是,你失去了在不同的Python解释器之间移植的能力,现在你已经被锁定在Jython中。如果您尝试这种方法,您将被锁定在库中。我之所以喜欢Jython,是因为您可以使用所有Java SE库来增加灵活性。