我有一个像
这样的属性文件Configuration.properties
path=/usr/bin
db=mysql
data_path=/temp
我需要读取此文件并在后续脚本中使用路径,db和data_path等变量。 我可以使用configParser或只是读取文件并获取值。 在此先感谢。
答案 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
编辑属性文件。
这是你的属性文件,在你的机器和工作区本地,并包含敏感数据,不要推送到版本控制!!!
[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
此属性文件由所有人共享,更改将推送到版本控制
#----------------------------------------------------
# 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/
此脚本是一个可重复使用的代码段,用于加载配置文件列表 导入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
此程序将导入上面的文件,并调用'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}