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

And*_*anu 124 python properties

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

propertyName1=propertyValue1
propertyName2=propertyValue2
...
propertyNameN=propertyValueN
Run Code Online (Sandbox Code Playgroud)

对于Java,有一个Properties类,它提供了解析/与上述格式交互的功能.

python标准库(2.x)中有类似的东西吗?

如果没有,我还有其他选择吗?

Jam*_*vec 66

我能够使用它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');
Run Code Online (Sandbox Code Playgroud)

属性文件: ConfigFile.properties

[DatabaseSection]
database.dbname=unitTest
database.user=root
database.password=
Run Code Online (Sandbox Code Playgroud)

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

  • ConfigParser 模块已在 Python 3 中重命名为 configparser。 (9认同)
  • 这适用于 .ini 文件,而不是 .properties 文件,因为它们不包含节,并且如果 configParser 找不到任何节标头,则会失败。此外,ini 文件可能不包含部分,因此这个 configParser 看起来根本不可靠 (7认同)

Tra*_*ear 64

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

import myconfig
Run Code Online (Sandbox Code Playgroud)

并直接访问属性

print myconfig.propertyName1
Run Code Online (Sandbox Code Playgroud)

  • `java属性文件是有效的python代码`:我必须有所不同.*有些*Java属性文件将传递有效的python代码,但肯定不是全部.正如@mmjj所说,点是个问题.所以是不带引号的文字字符串.-1. (35认同)
  • 一个相当糟糕的想法...因为它被打破了.Java prop文件允许":"而不是"="; 它们在继续之后吃空白; 他们不引用字符串.这些都不是"有效的Python". (24认同)
  • 我喜欢这个想法,但它不适用于包含点的属性,即`prop.name ="val"`在这种情况下不起作用. (10认同)
  • 这是最好避免的黑客攻击.当你的属性发生变化并且文件不再有效时,你将会遇到糟糕的一天. (3认同)
  • Java属性文件通常不会传递有效的python代码.另一种方法是在python文件中设置属性,并使用有效的python(例如:MEDIA_ROOT ='/ foo')... (2认同)

pyg*_*iel 61

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

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

  • 如果你不想使用Jython,pyjavaproperties似乎是一个选项:https://bitbucket.org/jnoller/pyjavaproperties (10认同)
  • java属性文件不等同于.ini文件.pyjavaproperties是正确的答案 (2认同)
  • Alex Matelli提出了一种使用ConfigParser解析.properties文件的简单方法http://stackoverflow.com/a/2819788/15274 (2认同)

Rob*_*rto 49

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

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
Run Code Online (Sandbox Code Playgroud)

您可以更改sep为":"以解析具有以下格式的文件:

key : value
Run Code Online (Sandbox Code Playgroud)

代码正确解析如下行:

url = "http://my-host.com"
name = Paul = Pablo
# This comment line will be ignored
Run Code Online (Sandbox Code Playgroud)

你会得到一个词典:

{"url": "http://my-host.com", "name": "Paul = Pablo" }
Run Code Online (Sandbox Code Playgroud)


Mat*_*ood 16

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


mva*_*ebr 7

如果您没有多行属性且需求非常简单,那么可以使用几行代码为您解决:

档案t.properties

a=b
c=d
e=f
Run Code Online (Sandbox Code Playgroud)

Python代码:

with open("t.properties") as f:
    l = [line.split("=") for line in f.readlines()]
    d = {key.strip(): value.strip() for key, value in l}
Run Code Online (Sandbox Code Playgroud)


Man*_*dan 6

这不是完全属性,但Python确实有一个很好的库来解析配置文件.另请参阅此配方:java.util.Properties的python替代品.


小智 5

我用过这个,这个库非常有用

from pyjavaproperties import Properties
p = Properties()
p.load(open('test.properties'))
p.list()
print(p)
print(p.items())
print(p['name3'])
p['name3'] = 'changed = value'
Run Code Online (Sandbox Code Playgroud)