如何在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}