python中的属性文件(类似于Java属性)

给定以下格式( .properties.ini ):

propertyName1=propertyValue1 propertyName2=propertyValue2 ... propertyNameN=propertyValueN 

对于Java而言 , Properties类提供了与上述格式parsing/交互的function。

Python标准库(2.x)中是否有类似的东西?

如果没有,我还有什么其他的select?

对于.ini文件, ConfigParser模块提供与.ini文件兼容的格式。

无论如何,没有什么可用于parsing完整的.properties文件,当我必须这样做时,我只是使用jython(我正在谈论脚本)。

java属性文件通常也是有效的python代码。 您可以将您的myconfig.properties文件重命名为myconfig.py。 然后就像这样导入你的文件

 import myconfig 

并直接访问属性

 print myconfig.propertyName1 

我能够得到这个与ConfigParser一起工作,没有人展示如何做到这一点,所以这里是一个简单的属性文件的python阅读器和属性文件的例子。 请注意,扩展名仍然是.properties ,但我不得不添加一个类似于你在.ini文件中看到的节标题…有点混蛋,但它的工作原理。

python文件: PythonPropertyReader.py

 #!/usr/bin/python import ConfigParser config = ConfigParser.RawConfigParser() config.read('ConfigFile.properties') print config.get('DatabaseSection', 'database.dbname'); 

属性文件: ConfigFile.properties

 [DatabaseSection] database.dbname=unitTest database.user=root database.password= 

有关更多function,请阅读: https : //docs.python.org/2/library/configparser.html

我知道这是一个非常古老的问题,但我现在需要它,我决定实现我自己的解决scheme,一个纯粹的Python解决scheme,涵盖大多数用例(不是全部):

 def load_properties(filepath, sep='=', comment_char='#'): """ Read the file passed as parameter as a properties file. """ props = {} with open(filepath, "rt") as f: for line in f: l = line.strip() if l and not l.startswith(comment_char): key_value = l.split(sep) key = key_value[0].strip() value = sep.join(key_value[1:]).strip().strip('"') props[key] = value return props 

您可以将sep更改为“:”以格式parsing文件:

 key : value 

代码parsing正确的行如下所示:

 url = "http://my-host.com" name = Paul = Pablo # This comment line will be ignored 

你会得到一个字典:

 {"url": "http://my-host.com", "name": "Paul = Pablo" } 

如果你有一个文件格式的选项,我build议你使用.ini和Python的ConfigParser。 如果您需要与Java .properties文件兼容,我为它编写了一个名为jprops的库。 我们正在使用pyjavaproperties,但遇到各种限制后,我实现了我自己的。 它完全支持.properties格式,包括unicode支持和更好的转义序列支持。 Jprops还可以parsing任何类似文件的对象,而pyjavaproperties只能用于磁盘上的真实文件。

这不是完全的属性,但Python确实有一个很好的parsingconfiguration文件的库 。 另请参阅此配方: java.util.Properties的pythonreplace 。

这里是我的项目的链接: https : //sourceforge.net/projects/pyproperties/ 。 它是一个用于处理Python 3.x的* .properties文件的库。

但它不是基于java.util.Properties

这是java.util.Propeties的一对一replace

从文档:

  def __parse(self, lines): """ Parse a list of lines and create an internal property dictionary """ # Every line in the file must consist of either a comment # or a key-value pair. A key-value pair is a line consisting # of a key which is a combination of non-white space characters # The separator character between key-value pairs is a '=', # ':' or a whitespace character not including the newline. # If the '=' or ':' characters are found, in the line, even # keys containing whitespace chars are allowed. # A line with only a key according to the rules above is also # fine. In such case, the value is considered as the empty string. # In order to include characters '=' or ':' in a key or value, # they have to be properly escaped using the backslash character. # Some examples of valid key-value pairs: # # key value # key=value # key:value # key value1,value2,value3 # key value1,value2,value3 \ # value4, value5 # key # This key= this value # key = value1 value2 value3 # Any line that starts with a '#' is considerered a comment # and skipped. Also any trailing or preceding whitespaces # are removed from the key/value. # This is a line parser. It parses the # contents like by line. 

这就是我在我的项目中所做的事情:我只是创build了另一个名为properties.py的.py文件,其中包含了我在项目中使用的所有常用variables/属性,并且在任何文件中都需要引用这些variables,

 from properties import *(or anything you need) 

当我经常改变开发地点时,使用这个方法保持svn和平,一些常见variables与当地环境相关。 对我来说工作正常,但不知道这种方法将被build议为正式的开发环境等。

我创build了一个与Java类的Properties类几乎相似的python模块(实际上它就像spring中的PropertyPlaceholderConfigurer,它允许你使用$ {variable-reference}引用已定义的属性)

编辑:您可以通过运行命令(目前testing的python 3)来安装此软件包。
pip install property

该项目托pipe在GitHub上

例子:(详细的文档可以在这里find)

假设您在my_file.properties文件中定义了以下属性

 foo = I am awesome bar = ${chocolate}-bar chocolate = fudge 

加载上述属性的代码

 from properties.p import Property prop = Property() # Simply load it into a dictionary dic_prop = prop.load_property_files('my_file.properties') 

你可以在ConfigParser.RawConfigParser.readfp定义的ConfigParser.RawConfigParser.readfp使用类似文件的对象 – > https://docs.python.org/2/library/configparser.html#ConfigParser.RawConfigParser.readfp

定义一个覆盖readline的类,在属性文件的实际内容之前添加一个节名称。

我将它打包到返回所有定义属性的dict的类中。

 import ConfigParser class PropertiesReader(object): def __init__(self, properties_file_name): self.name = properties_file_name self.main_section = 'main' # Add dummy section on top self.lines = [ '[%s]\n' % self.main_section ] with open(properties_file_name) as f: self.lines.extend(f.readlines()) # This makes sure that iterator in readfp stops self.lines.append('') def readline(self): return self.lines.pop(0) def read_properties(self): config = ConfigParser.RawConfigParser() # Without next line the property names will be lowercased config.optionxform = str config.readfp(self) return dict(config.items(self.main_section)) if __name__ == '__main__': print PropertiesReader('/path/to/file.properties').read_properties() 

我使用ConfigParser如下所示。 该代码假定在BaseTest所在的同一目录中有一个名为config.prop的文件:

config.prop

 [CredentialSection] app.name=MyAppName 

BaseTest.py:

 import unittest import ConfigParser class BaseTest(unittest.TestCase): def setUp(self): __SECTION = 'CredentialSection' config = ConfigParser.ConfigParser() config.readfp(open('config.prop')) self.__app_name = config.get(__SECTION, 'app.name') def test1(self): print self.__app_name % This should print: MyAppName 
 import json f=open('test.json') x=json.load(f) f.close() print(x) 

test.json的内容:{“host”:“127.0.0.1”,“user”:“jms”}

这是我写的parsing文件,并将其设置为envvariables,它跳过注释和非键值行添加开关来指定hg:d

  • -h或–help打印用法摘要
  • -c指定标识注释的字符
  • -s在prop文件中键和值之间的分隔符
  • 并指定需要parsing的属性文件,例如:python EnvParamSet.py -c#-s = env.properties

     import pipes import sys , getopt import os.path class Parsing : def __init__(self , seprator , commentChar , propFile): self.seprator = seprator self.commentChar = commentChar self.propFile = propFile def parseProp(self): prop = open(self.propFile,'rU') for line in prop : if line.startswith(self.commentChar)==False and line.find(self.seprator) != -1 : keyValue = line.split(self.seprator) key = keyValue[0].strip() value = keyValue[1].strip() print("export %s=%s" % (str (key),pipes.quote(str(value)))) class EnvParamSet: def main (argv): seprator = '=' comment = '#' if len(argv) is 0: print "Please Specify properties file to be parsed " sys.exit() propFile=argv[-1] try : opts, args = getopt.getopt(argv, "hs:c:f:", ["help", "seprator=","comment=", "file="]) except getopt.GetoptError,e: print str(e) print " possible arguments -s <key value sperator > -c < comment char > <file> \n Try -h or --help " sys.exit(2) if os.path.isfile(args[0])==False: print "File doesnt exist " sys.exit() for opt , arg in opts : if opt in ("-h" , "--help"): print " hg:d \n -h or --help print usage summary \n -c Specify char that idetifes comment \n -s Sperator between key and value in prop file \n specify file " sys.exit() elif opt in ("-s" , "--seprator"): seprator = arg elif opt in ("-c" , "--comment"): comment = arg p = Parsing( seprator, comment , propFile) p.parseProp() if __name__ == "__main__": main(sys.argv[1:]) 

这是一个非常古老的问题,但仍然…如果需要以简单的方式读取属性文件中的所有值:

  import configparser config = configparser.RawConfigParser() config.read('path_to_config.properties file') details_dict = dict(config.items('SECTION_NAME')) 

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

下面的post显示了两行使用Python List Comprehension加载“java style”属性文件的代码。 请看下面的post

https://ilearnonlinesite.wordpress.com/2017/07/24/reading-property-file-in-python-using-comprehension-and-generators/