如何在python中读取属性文件

时间:2015-01-14 14:18:15

标签: python configparser

我有一个像

这样的属性文件
Configuration.properties
path=/usr/bin
db=mysql
data_path=/temp

我需要读取此文件并在后续脚本中使用路径,db和data_path等变量。 我可以使用configParser或只是读取文件并获取值。 在此先感谢。

6 个答案:

答案 0 :(得分:5)

对于没有节标题的配置文件,由[]包围 - 您会发现抛出了ConfigParser.NoSectionError异常。通过插入假冒的方法可以解决这个问题。节标题 - 如this answer中所示。

如果文件很简单,如pcalcao's answer中所述,您可以执行一些字符串操作来提取值。

这是一个代码片段,它返回配置文件中每个元素的键值对字典。

separator = "="
keys = {}

# I named your file conf and stored it 
# in the same directory as the script

with open('conf') as f:

    for line in f:
        if separator in line:

            # Find the name and value by splitting the string
            name, value = line.split(separator, 1)

            # Assign key value pair to dict
            # strip() removes white space from the ends of strings
            keys[name.strip()] = value.strip()

print(keys)

答案 1 :(得分:3)

我喜欢当前的答案。并且......我觉得在“真实世界”中有一种更清洁的方式。如果您正在进行任何大小或规模的项目,尤其是在“多个”环境中,则必须使用节标题功能。我想使用一个强大的真实世界示例,使用格式良好的可复制代码将其放入此处。这是在Ubuntu 14中运行,但跨平台工作:

真实世界简单示例

“基于环境”的配置
设置示例(终端):

  
    

cd~ / my / cool / project     触摸local.properties     触摸environ.properties     ls -la~ / my / cool / project         -rwx ------ 1 www-data www-data 0 Jan 24 23:37 local.properties         -rwx ------ 1 www-data www-data 0 Jan 24 23:37 environ.properties

  

设置好的权限

>> chmod 644 local.properties
>> chmod 644 env.properties
>> ls -la
-rwxr--r-- 1 www-data www-data  0 Jan 24 23:37 local.properties
-rwxr--r-- 1 www-data www-data  0 Jan 24 23:37 environ.properties

编辑属性文件。

FILE 1:local.properties

这是你的属性文件,在你的机器和工作区本地,并包含敏感数据,不要推送到版本控制!!!

[global]
relPath=local/path/to/images              
filefilters=(.jpg)|(.png)

[dev.mysql]
dbPwd=localpwd
dbUser=localrootuser

[prod.mysql]
dbPwd=5tR0ngpwD!@#
dbUser=serverRootUser

[branch]
# change this to point the script at a specific environment
env=dev

FILE 2:environ.properties

此属性文件由所有人共享,更改将推送到版本控制

#----------------------------------------------------
# Dev Environment
#----------------------------------------------------

[dev.mysql]
dbUrl=localhost
dbName=db

[dev.ftp]
site=localhost
uploaddir=http://localhost/www/public/images

[dev.cdn]
url=http://localhost/cdn/www/images


#----------------------------------------------------
# Prod Environment
#----------------------------------------------------
[prod.mysql]
dbUrl=http://yoursite.com:80
dbName=db

[prod.ftp]
site=ftp.yoursite.com:22
uploaddir=/www/public/

[prod.cdn]
url=http://s3.amazon.com/your/images/

Python文件:readCfg.py

此脚本是一个可重复使用的代码段,用于加载配置文件列表     导入ConfigParser     import os

# a simple function to read an array of configuration files into a config object
def read_config(cfg_files):
    if(cfg_files != None):
        config = ConfigParser.RawConfigParser()

        # merges all files into a single config
        for i, cfg_file in enumerate(cfg_files):
            if(os.path.exists(cfg_file)):
                config.read(cfg_file)

        return config

Python文件:yourCoolProgram.py

此程序将导入上面的文件,并调用'read_config'方法

from readCfg import read_config

#merge all into one config dictionary
config      = read_config(['local.properties', 'environ.properties'])

if(config == None):
    return

# get the current branch (from local.properties)
env      = config.get('branch','env')        

# proceed to point everything at the 'branched' resources
dbUrl       = config.get(env+'.mysql','dbUrl')
dbUser      = config.get(env+'.mysql','dbUser')
dbPwd       = config.get(env+'.mysql','dbPwd')
dbName      = config.get(env+'.mysql','dbName')

# global values
relPath = config.get('global','relPath')
filefilterList = config.get('global','filefilters').split('|')

print "files are: ", fileFilterList, "relative dir is: ", relPath
print "branch is: ", env, " sensitive data: ", dbUser, dbPwd

结论

鉴于上述配置,您现在可以通过更改“local.properties”中的[branch] env值来创建完全更改环境的脚本。这一切都基于良好的配置原则! Yaay!

答案 2 :(得分:0)

是的,是的,你可以。

ConfigParser(https://docs.python.org/2/library/configparser.html)将为您提供一个很好的小结构来从开箱即用中获取值,手动执行需要一些字符串拆分,但对于简单的格式文件,它是' s没什么大不了的。

问题是"我如何阅读此文件?"。

答案 3 :(得分: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是:

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

现在获取key1的值:     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'] 

----------------------------------------------- --------------

扩展上述方法,自动逐节阅读,然后按部分名称后跟密钥名称进行访问。

def get_config_section():
    if not hasattr(get_config_section, 'section_dict'):
        get_config_section.section_dict = dict()

        for section in config.sections():
            get_config_section.section_dict[section] = 
                             dict(config.items(section))

    return get_config_section.section_dict

访问:

config_dict = get_config_section()

port = config_dict['DB']['port'] 

(这里'DB'是配置文件中的部分名称     'port'是'DB'部分下的一个键。)

答案 4 :(得分:0)

如果你想在python中读取proeprties文件,我的第一个建议,我自己没有关注,因为我太喜欢Visual Code了......

在Jython上运行你的python。 一旦你在Jython上运行python,你就可以轻松地为你的数据文件打开一个java util输入流。使用java.utl.Properties可以调用load()api,然后设置为go。 所以我的建议是,做最简单的事情,只需开始使用java运行时环境和jython。

顺便说一句,我当然使用jython来运行python。 没问题。

但是我没做的是使用jython来调试python ......可悲的是! 对我来说问题是我使用microsft可视代码来编写pythong,然后是啊...然后我坚持我正常的python安装。 不是一个理想的世界!

如果这是你的情况。 然后你可以去计划(b)...... 尽量不要使用JDK库并在其他地方找到另一种选择。

所以这就是消化。 这是一个我发现的库,我正在使用它来读取属性文件的效果。 https://pypi.python.org/pypi/jproperties/1.0.1#downloads

from jproperties import Properties
with open("foobar.properties", "r+b") as f:
    p = Properties()
    p.load(f, "utf-8")

    # Do stuff with the p object...

    f.truncate(0)
    p.store(f, encoding="utf-8")

所以在上面的代码引用中,你看到了它们如何打开属性文件。 将其擦除,然后将属性再次写回文件。

将属性对象作为字典对象。 然后你做的事情如下:

myPropertiesTuple = propertiesObjec[myPropertyKey]

小心点。当您使用上面的api并获取键的值时,该值是一个PropertiesTuple。它是一对(值,元数据)。因此,您将从myPropertiesTuple [0]获取它的价值。除此之外,只需阅读页面上文档正常运行的文档。

我正在使用方法(b)。 如果在某些时候使用java库的优势超过了坚持使用本机python语言的优势,那么我就可以调试可视代码。

我将听到对纯python运行时的支持,并使用硬依赖关系jython runtime / java libararies对代码进行comrpomise。 到目前为止没有必要。

那么,蓝色药丸还是红色药丸?

答案 5 :(得分:0)

一个衬里,用于在忽略注释的情况下读取非结构化属性文件(无节):

with open(props_file_path, "r", encoding="utf-8") as f:
    props = {e[0]: e[1] for e in [line.split('#')[0].strip().split('=') for line in f] if len(e) == 2}