Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中读取属性文件_Python_Configparser - Fatal编程技术网

如何在python中读取属性文件

如何在python中读取属性文件,python,configparser,Python,Configparser,我有一个像这样的属性文件 Configuration.properties path=/usr/bin db=mysql data_path=/temp 我需要读取此文件,并在后续脚本中使用变量,如path、db和data_path。 我可以使用configParser来实现这一点,或者只是读取文件并获取值。 提前谢谢。是的,是的,你可以 ConfigParser()将为您提供一个很好的小结构,以便从开箱即用中获取值,手工操作将需要一些字符串拆分,但是对于一个简单格式的文件来说,这没什么大不了

我有一个像这样的属性文件

Configuration.properties
path=/usr/bin
db=mysql
data_path=/temp
我需要读取此文件,并在后续脚本中使用变量,如path、db和data_path。 我可以使用configParser来实现这一点,或者只是读取文件并获取值。 提前谢谢。

是的,是的,你可以

ConfigParser()将为您提供一个很好的小结构,以便从开箱即用中获取值,手工操作将需要一些字符串拆分,但是对于一个简单格式的文件来说,这没什么大不了的


问题是“如何读取此文件?”。

对于没有节头的配置文件,由
[]
包围-您将找到
ConfigParser。将引发NoSectionError
异常。通过插入“假”节标题可以解决此问题,如中所示

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

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

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)

我喜欢现在的答案。而且。。。我觉得在“现实世界”中有一种更干净的方法。如果您正在执行任何大小或规模的项目,尤其是在“多”环境中,则必须使用节标题功能。我想用一个健壮的现实世界示例,将它与格式良好的可复制代码放在一起。这在Ubuntu 14中运行,但可以跨平台工作:

真实世界的简单示例 “基于环境”的配置
设置示例(终端):

cd~/my/cool/project 触摸本地的属性 触摸环境属性 ls-la~/my/cool/project -rwx-----1 www-data www-data 0 Jan 24 23:37 local.properties -rwx-----1 www data 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
编辑属性文件

文件1:local.properties 这是您的属性文件,位于您的计算机和工作区的本地,包含敏感数据,不要推送到版本控制

文件2:environ.properties 此属性文件由所有人共享,更改被推送到版本控制

Python文件:readCfg.py 此脚本是一个可重用的代码段,用于加载配置文件列表 导入配置分析器 导入操作系统

# 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”方法

结论
根据上述配置,您现在可以使用一个脚本,通过更改“local.properties”中的[branch]env值来完全更改环境。这一切都是基于良好的配置原则!耶

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

您的
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'))
这将为您提供一个字典,其中键与配置文件中的键及其对应值相同

详细信息\u dict
是:

{'key1':'value1', 'key2':'value2'}
现在要获取key1的值:
details\u dict['key1']

将其全部放在一个只从配置文件读取该节一次的方法中(在程序运行期间第一次调用该方法)

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

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”部分下的一个键。)

如果您想阅读python中的proeprites文件,我的第一个建议是,我自己没有遵循,因为我太喜欢可视化代码了

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

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

但我没有做的是使用jython调试python。。。悲哀地 对我来说,问题是我使用microsft可视化代码来编写蟒蛇,然后是的。。。然后,我坚持使用我正常的python安装。 这不是一个理想的世界

如果这是你的情况。 然后你可以去计划(b)。。。 尽量不要使用JDK库,并在其他地方找到替代方法

这就是sugestion。 这是我发现的一个库,我正在使用它来读取属性文件。

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

将属性对象作为字典对象处理。 然后你会做一些事情,比如:

myPropertiesTuple = propertiesObjec[myPropertyKey]
小心点。当您使用上面的api并获取一个键的值时,该值是一个PropertiesTuple。它是一对(值、元数据)。因此,您要查找的值可以从myPropertiesTuple[0]获得。除此之外,只需阅读页面上的文档即可,该库运行良好

我使用的是方法(b)。 如果在某种程度上使用java库的优势超过了仅仅为了在可视化代码上调试而坚持使用本机python语言的优势

我将听到beat drop对纯python运行时的支持,并将代码与jython运行时/java库的硬依赖性结合起来。 到目前为止,没有必要这样做


所以,蓝色的账单还是红色的药丸?

一行代码用于读取非结构化属性文件(无节),同时忽略注释:

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}

第一行“Configuration.properties”是数据文件的一部分吗?不,是文件名这是我的代码:#/usr/bin/python导入ConfigParser ConfigParser=ConfigParser.RawConfigParser()configFilePath=r'/opt/aor/regression/test\u scena
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'] 
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]
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}