...

Python解析Properties文件

  1. 支持#注释及\换行
  2. 支持多级属性赋值,如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'}}
posted @ 2024-11-27 23:02  韩志超  阅读(70)  评论(0)    收藏  举报