在DTCloud中支持yaml文件

扶程星云 2023-02-07 17:34:44
在项目实施中需要一个统一的撰写配置文件规范而且配置文件较为通用且易读,有没有解决方案呢?答案是有的,目前介绍一种配置文件规范 「YAML 语言」.本工具专用于对项目config下的config.yaml文件操作,填补DTCloud原读取.conf文件若干不足之处,期望大部分项目配置文件通过这个工具读取。 原则本工具只供读取配置文件使用.

使用方法:YamlConfig.read("list.inCloud", "defInfo222") ,传入要读取的地址,多级地址用.分隔。

公用代码

# &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
# DTCloud360
# QQ:35350428
# 邮件:35350428@qq.com
# 手机:13584935775
# 作者:Nebula Fortune(扶程星云)
# 公司网址: http://www.dtcloud360.com/
# Copyright 中亿丰数字科技集团有限公司
# 日期:2023/2/7 10:16
# 文件:     config_public.py
# 备注:
# &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

def get_config_by_path(pathStr, configStr):
    """读取传入的配置文件,读取匹配路径的值

    传入要读取的配置文件和字典路径,在配置文件中找到该路径的值,返回该值,如果没有该值或读取出错,则返回None,多重路径通过.分隔

    args:
       pathStr:要解析的路径,多重路径用.分隔,比如 list.inCloud
       configStr:读到的config文件内容

    return:
        value_str: 读取到的值
    """
    value_str = configStr
    path_list = pathStr.split('.')
    for key in path_list:
        if key in value_str:
            value_str = value_str[key]
        else:
            return None
    return value_str

主要代码

# &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
# DTCloud360
# QQ:35350428
# 邮件:35350428@qq.com
# 手机:13584935775
# 作者:Nebula Fortune(扶程星云)
# 公司网址: http://www.dtcloud360.com/
# Copyright 中亿丰数字科技集团有限公司
# 日期:2023/2/7 10:16
# 文件:     yaml_config.py
# 备注:
# &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

import logging
import os.path
import warnings
import yaml

from config_public import get_config_by_path

# 换源  pip config set global.index-url https://pypi.douban.com/simple/
# 换回默认源
# pip config unset global.index-url
# pip install pyyaml -i https://pypi.douban.com/simple


_logger = logging.getLogger(__name__)


class YamlConfig:
    """yaml配置文件读取工具

     在项目实施中需要一个统一的撰写配置文件规范而且配置文件较为通用且易读,有没有解决方案呢?答案是有的,目前介绍一种配置文件规范 「YAML 语言」.
      本工具专用于对项目config下的config.yaml文件操作,填补DTCloud原读取.conf文件若干不足之处,期望大部分项目配置文件通过这个工具读取。
      原则本工具只供读取配置文件使用.
    """
    projectPath = os.path.abspath(os.path.join(os.getcwd(), "../.."))  # 当前项目目录
    configFullPath = os.path.join(projectPath, "config")  # 当前配置项目配置文件目录
    configFileFullPath = os.path.join(configFullPath, "config.yaml")  # 当前配置文件全路径

    @classmethod
    def read(cls, pathStr, defStr):
        """读取配置文件里面的值

        传入要读取的路径和默认值,在配置文件中找到该路径的值,返回该值,如果没有该值或读取出错,则返回默认值,多重路径通过.分隔

        args:
           pathStr:要解析的路径,多重路径用.分隔,比如 list.inCloud
           defStr:默认返回值,如果不成功,则返回默认值

        returns:
            value: 读取到的值
            err: 出错信息。如果err为None,则是真正读到了值,否则返回的值就是默认的值。

        Raises:
            yaml.YAMLError: yaml读取异常
            路径不存在
            文件不存在
            未读到值
        """
        err = None
        if not os.path.exists(YamlConfig.configFullPath):  # 判断路径是否存在
            err = f'路径{YamlConfig.configFullPath}不存在.'
            return defStr, err

        if not os.path.isfile(YamlConfig.configFileFullPath):  # 判断文件是否存在
            err = f'文件{YamlConfig.configFileFullPath}不存在'
            return defStr, err
        with open(YamlConfig.configFileFullPath, "r", encoding='utf-8') as stream:
            try:
                config = yaml.safe_load(stream)
                value = get_config_by_path(pathStr, config)
                if value is None:
                    value = defStr
                    err = "未读到值"
                return value, err
            except yaml.YAMLError as e:
                err = f'YamlConfig read err:{e}'
                return defStr, err

    @classmethod
    def new(cls, data):
        """谨慎使用:会清空原文件所有数据,不做任何检查,直接插入纪录!"""
        warnings.warn("谨慎使用:会清空原文件所有数据,不做任何检查,直接插入纪录!", DeprecationWarning)
        err = None
        if not os.path.exists(YamlConfig.configFullPath):  # 判断路径是否存在
            try:
                os.makedirs(YamlConfig.configFullPath)
            except Exception as e:
                err = f'路径{YamlConfig.configFullPath}创建失败, err:{e}'
                return err

        with open(YamlConfig.configFileFullPath, 'w', encoding='utf-8') as f:
            yaml.dump(data, f, default_flow_style=False, allow_unicode=True)
        return err


if __name__ == '__main__':
    date = {
        "name": "Tom",
        "age": 23,
        "sex": "man",
        'list': {'inCloud': [1, 2, 3]}
    }
    YamlConfig.new(date)
    print(YamlConfig.read("list.inCloud", "defInfo222"))
# print(configFullPath)

 

...全文
115 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
代码下载地址: https://pan.quark.cn/s/068306a56640 在交通运输科学范畴内,交通流量分配是探讨交通系统内交通负荷如何在各个道路路段间进行合理分配的核心议题。交通流分配技术主要应用于模拟和推演交通系统的运行状态,旨在为城市规划人员与交通工程师提供优化道路布局的参考,进而缓解交通拥堵现象,提升道路交通的整体效能。以下将对"交通流分配技术"进行深入阐述: 1. **全部或无分配(All-or-Nothing Distribution)** 全部或无分配是一种基础的交通流分配策略。该技术依据最短路径准则,预设所有从发源地(Origin)至目的地(Destination)的车辆都将选择路程最短的路线。倘若存在多条等长路径,则采用随机方式确定其一条。此类方法未将交通拥堵因素纳入考量,因为一旦选定路径,便假定所有交通量将沿此路径通行,即便这可能导致部分路段出现超负荷状况。 2. **逐步分配(Progressive Assignment)** 逐步分配技术顾及了交通网络的动态特征。该算法通过逐步优化流量配置,力求使网络内行驶的总代价(诸如通行时间、距离等指标)最小化。运算过程始于初始的全部或无分配状态,随后逐步修正路径选择,直至网络达成稳定状态,即每次流量修正后,总代价的变动幅度不再明显。此方法更贴近现实交通场景,因为车辆会依据即时路况选择最优路径。 3. **迭代平均分配(Iterative Average Distribution)** 迭代平均分配是一种对逐步分配技术的优化版本,其更侧重于实现网络流量的均衡化。在每一轮迭代过程,算法不仅评估当前路径的优化程度,同时参考前一次迭代的流量配置。通过融入平均化理念,该方法能更有效地分散交通...

4,956

社区成员

发帖
与我相关
我的任务
社区描述
DTCloud是一套基于Pthon+Go开源商业应用程序.主要面向建筑工程行业,物联网行业,数字化行业,打造的企业信息一体化的解决方案。
物联网 企业社区
社区管理员
  • 昆山一百计算机有限公司
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧