Python解析Properties文件
- 支持
#
注释及\
换行 - 支持多级属性赋值,如a.b.c=1
demo.properties
appId=cactus
# 公钥
publicKey=-----BEGIN PUBLIC KEY-----\n\
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEP9eQZFl3j5zZX8bmYYEznA0z3/X+\n\
TooIQ11rxFcPZsTvJPLCUY7NHasUenXJngmvRXSnP4odegaoe4usLDv/3A==\n\
-----END PUBLIC KEY-----
app.config.host=127.0.0.1
app.config.port=8080
load_properteis.py
import re
def load_properties(filepath):
with open(filepath) as f:
raw = f.read()
# 去掉注释和处理换行
body = re.sub(r'#.*|\\\n', '', raw)
data = {}
for line in body.split('\n'):
# 如果非空
if line:
key, value = line.split('=', 1)
# 处理多级属性,例如 a.b.c = 1
if '.' in key:
nodes = key.split(".")
cur = data
for node in nodes[:-1]:
if cur.get(node) is None:
cur[node] = {}
else:
assert isinstance(cur.get(node), dict), "数据格式错误"
cur = cur[node]
cur[nodes[-1]] = value
else:
data.update({key: value})
return data
if __name__ == '__main__':
data = load_properties('demo.properties')
for key, value in data.items():
print(f'{key}={value}')
执行结果
appId=cactus
publicKey=-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEP9eQZFl3j5zZX8bmYYEznA0z3/X+\nTooIQ11rxFcPZsTvJPLCUY7NHasUenXJngmvRXSnP4odegaoe4usLDv/3A==\n-----END PUBLIC KEY-----
app={'config': {'host': '127.0.0.1', 'port': '8080'}}