[python]常用配置读取方法

这篇具有很好参考价值的文章主要介绍了[python]常用配置读取方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

常见的应用配置方式有环境变量和配置文件,对于微服务应用,还会从配置中心加载配置,比如nacos、etcd等,有的应用还会把部分配置写在数据库中。此处主要记录从环境变量、.env文件、.ini文件、.yaml文件、.toml文件、.json文件读取配置。

ini文件

ini文件格式一般如下:

[mysql]
type = "mysql"
host = "127.0.0.1"
port = 3306
username = "root"
password = "123456"
dbname = "test"

[redis]
host = "127.0.0.1"
port = 6379
password = "123456"
db = "5"

使用python标准库中的configparser可以读取ini文件。

import configparser
import os

def read_ini(filename: str = "conf/app.ini"):
    """
    Read configuration from ini file.
    :param filename: filename of the ini file
    """
    config = configparser.ConfigParser()
    if not os.path.exists(filename):
        raise FileNotFoundError(f"File {filename} not found")
    config.read(filename, encoding="utf-8")
    return config

config类型为configparser.ConfigParser,可以使用如下方式读取

config = read_ini("conf/app.ini")

for section in config.sections():
    for k,v in config.items(section):
        print(f"{section}.{k}: {v}")

读取输出示例

mysql.type: "mysql"
mysql.host: "127.0.0.1"
mysql.port: 3306
mysql.username: "root"
mysql.password: "123456"
mysql.dbname: "test"
redis.host: "127.0.0.1"
redis.port: 6379
redis.password: "123456"
redis.db: "5"

yaml文件

yaml文件内容示例如下:

database:
  mysql:
    host: "127.0.0.1"
    port: 3306
    user: "root"
    password: "123456"
    dbname: "test"
  redis:
    host: 
      - "192.168.0.10"
      - "192.168.0.11"
    port: 6379
    password: "123456"
    db: "5"

log:
  directory: "logs"
  level: "debug"
  maxsize: 100
  maxage: 30
  maxbackups: 30
  compress: true

读取yaml文件需要安装pyyaml

pip install pyyaml

读取yaml文件的示例代码

import yaml
import os

def read_yaml(filename: str = "conf/app.yaml"):
    if not os.path.exists(filename):
        raise FileNotFoundError(f"File {filename} not found")
    with open(filename, "r", encoding="utf-8") as f:
        config = yaml.safe_load(f.read())
        return config
    
if __name__ == "__main__":
    config = read_yaml("conf/app.yaml")
    print(type(config))
    print(config)

执行输出,可以看到config是个字典类型,通过key就可以访问到

<class 'dict'>
{'database': {'mysql': {'host': '127.0.0.1', 'port': 3306, 'user': 'root', 'password': '123456', 'dbname': 'test'}, 'redis': {'host': ['192.168.0.10', '192.168.0.11'], 'port': 6379, 'password': '123456', 'db': '5'}}, 'log': {'directory': 'logs', 'level': 'debug', 'maxsize': 100, 'maxage': 30, 'maxbackups': 30, 'compress': True}}

toml文件

toml文件比较像yaml,但是不要求缩进格式。如果比较讨厌yaml的缩进问题,那么可以考虑下使用toml。一个简单的toml文件示例如下:

[database]
dbtype = "mysql"

[database.mysql]
host = "127.0.0.1"
port = 3306
user = "root"
password = "123456"
dbname = "test"

[database.redis]
host = ["192.168.0.10", "192.168.0.11"]
port = 6379
password = "123456"
db = "5"

[log]
directory = "logs"
level = "debug"

如果python版本高于3.11,其标准库tomllib就可以读取toml文件。读取toml文件的第三方库也有很多,个人一般使用toml

pip install toml

读取toml文件的示例代码

import tomllib # python version >= 3.11
import toml
import os

def read_toml_1(filename: str = "conf/app.toml"):
    """ 
    Read configuration from toml file using tomllib that is python standard package.
    Python version >= 3.11
    """
    if not os.path.exists(filename):
        raise FileNotFoundError(f"File {filename} not found")
    with open(filename, "rb") as f:
        config = tomllib.load(f)
        return config
    
def read_toml_2(filename: str = "conf/app.toml"):
    """
    Read configuration from toml file using toml package.
    """
    if not os.path.exists(filename):
        raise FileNotFoundError(f"File {filename} not found")
    
    with open(filename, "r" ,encoding="utf-8") as f:
        config = toml.load(f)
        return config
    
if __name__ == "__main__":
    config = read_toml_1("conf/app.yaml")
    # config = read_toml_2("conf/app.yaml")
    print(type(config))
    print(config)

执行输出,无论使用tomllibtoml,返回的都是dict类型,都可以直接使用key访问。

<class 'dict'>
{'database': {'mysql': {'host': '127.0.0.1', 'port': 3306, 'user': 'root', 'password': '123456', 'dbname': 'test'}, 'redis': {'host': ['192.168.0.10', '192.168.0.11'], 'port': 6379, 'password': '123456', 'db': '5'}}, 'log': {'directory': 'logs', 'level': 'debug', 'maxsize': 100, 'maxage': 30, 'maxbackups': 30, 'compress': True}}

json文件

使用标准库json即可读取json文件,json配置文件示例:

{
    "database": {
        "mysql": {
            "host": "127.0.0.1",
            "port": 3306,
            "user": "root",
            "password": "123456",
            "dbname": "test"
        },
        "redis": {
            "host": [
                "192.168.0.10",
                "192.168.0.11"
            ],
            "port": 6379,
            "password": "123456",
            "db": "5" 
        }
    },
    "log": {
        "level": "debug",
        "dir": "logs"
    }
}

解析的示例代码如下

import json
import os

def read_json(filename: str = "conf/app.json") -> dict:
    """
    Read configuration from json file using json package.
    """
    if not os.path.exists(filename):
        raise FileNotFoundError(f"File {filename} not found")
    with open(filename, "r", encoding="utf-8") as f:
        config = json.load(f)
        return config
    
if __name__ == "__main__":
    config = read_json("conf/app.yaml")
    print(type(config))
    print(config)

执行输出

<class 'dict'>
{'database': {'mysql': {'host': '127.0.0.1', 'port': 3306, 'user': 'root', 'password': '123456', 'dbname': 'test'}, 'redis': {'host': ['192.168.0.10', '192.168.0.11'], 'port': 6379, 'password': '123456', 'db': '5'}}, 'log': {'level': 'debug', 'dir': 'logs'}}

.env文件

.env文件读取键值对配置,并将它们添加到环境变量中,添加后可以使用os.getenv()获取。

读取.env文件需要安装第三方库

pip install python-dotenv

.env文件示例

MYSQL_HOST="127.0.0.1"
MYSQL_PORT=3306
MYSQL_USERNAME="root"
MYSQL_PASSWORD="123456"
MYSQL_DATABASE="test"

示例代码

import os
import dotenv

def read_dotenv(filename: str = "conf/.env"):
    if not os.path.exists(filename):
        raise FileNotFoundError(f"File {filename} not found")
    load_dotenv(dotenv_path=filename, encoding="utf-8", override=True)
    config = dict(os.environ)
    return config

if __name__ == "__main__":
    config = read_json("conf/app.yaml")
    for k,v in config.items():
        if k.startswith("MYSQL_"):
            print(f"{k}: {v}")

读取环境变量

在标准库os中有以下常用的和环境变量相关的方法,具体可参考官方文档:https://docs.python.org/zh-cn/3/library/os.html

  • os.environ,一个mapping对象,其中键值是代表进程环境的字符串。例如 environ["HOME"]
# example
import os
config = dict(os.environ)
for k,v in config.items():
    print(k,v)
  • os.getenv(key, default=None)。如果环境变量 key 存在则将其值作为字符串返回,如果不存在则返回 default。
  • os.putenv(key, value)。设置环境变量,官方文档推荐直接修改os.environ。例如:os.putenv("MYSQL_HOST", "127.0.0.1")
  • os.unsetenv(key)。删除名为 key 的环境变量,官方文档推荐直接修改os.environ。例如:os.unsetenv("MYSQL_HOST")

综合示例

一般来说配置解析相关代码会放到单独的包中,配置文件也会放到单独的目录,这里给个简单的示例。

目录结构如下,conf目录存放配置文件,pkg/config.py用于解析配置,main.py为程序入口。

.
├── conf
│   ├── app.ini
│   ├── app.json
│   ├── app.toml
│   └── app.yaml
├── main.py
└── pkg
    ├── config.py
    └── __init__.py

pkg/__init__.py文件为空,pkg/config.py内容如下:

import configparser
import os
import yaml
import tomllib
import json
import abc
from dotenv import load_dotenv

class Configer(metaclass=abc.ABCMeta):
    def __init__(self, filename: str):
        self.filename = filename

    @abc.abstractmethod
    def load(self):
        raise NotImplementedError(f"subclass must implement this method")
    
    def file_exists(self):
        if not os.path.exists(self.filename):
            raise FileNotFoundError(f"File {self.filename} not found")

class IniParser(Configer):
    def __init__(self, filename: str):
        super().__init__(filename)

    def load(self):
        super().file_exists()
        config = configparser.ConfigParser()
        config.read(self.filename, encoding="utf-8")
        return config

class YamlParser(Configer):
    def __init__(self, filename: str):
        super().__init__(filename)

    def load(self):
        super().file_exists()
        with open(self.filename, "r", encoding="utf-8") as f:
            config = yaml.safe_load(f.read())
            return config

class TomlParser(Configer):
    def __init__(self, filename: str):
        super().__init__(filename)

    def load(self):
        super().file_exists()
        with open(self.filename, "rb") as f:
            config = tomllib.load(f)
            return config
        
class JsonParser(Configer):
    def __init__(self, cfgtype: str, filename: str = None):
        super().__init__(cfgtype, filename)

    def load(self):
        super().file_exists()
        with open(self.filename, "r", encoding="utf-8") as f:
            config = json.load(f)
            return config
        
class DotenvParser(Configer):
    def __init__(self, filename: str = None):
        super().__init__(filename)

    def load(self):
        super().file_exists()
        load_dotenv(self.filename, override=True)
        config = dict(os.environ)
        return config

main.py示例:

from pkg.config import TomlParser

config = TomlParser("conf/app.toml")
print(config.load())

执行输出文章来源地址https://www.toymoban.com/news/detail-777068.html

{'database': {'dbtype': 'mysql', 'mysql': {'host': '127.0.0.1', 'port': 3306, 'user': 'root', 'password': '123456', 'dbname': 'test'}, 'redis': {'host': ['192.168.0.10', '192.168.0.11'], 'port': 6379, 'password': '123456', 'db': '5'}}, 'log': {'directory': 'logs', 'level': 'debug'}}

到了这里,关于[python]常用配置读取方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv基础: 视频,摄像头读取与保存的常用方法

    当然还可以从视频中抓取截图,所以现在聊一下常用的抓取视频截图的的方法。 上面有三种构造方法, 第一种是无法构造方法。 第二种参数device是一个数字。 一般笔记本如此写cv2.VideoCapture(0); 因为默认是0 ,如果有多个摄像头,就需要看设置的摄像头代表的数字了。 第二种

    2024年02月09日
    浏览(32)
  • Python:实现文件读取与输入,数据存储与读取的常用命令

    文本文件可用于存储大量的数据,里面的数据对于用户而言十分重要,因此,本文就如何利用Python实现文本内容的读取与输入,数据存储与读取进行介绍。 一、读取文件中的数据: 首先需要找到所需文件的路径:例如我在桌面创建了一个文本文件,它的路径为 利用函数 op

    2023年04月08日
    浏览(39)
  • 【数据处理】Pandas读取CSV文件示例及常用方法(入门)

    查看读取前10行数据 2067 向前填充 指定列的插值填充 使用某数据填充指定列的空值 示例: 类似切片 array([‘SE’, ‘cv’, ‘NW’, ‘NE’], dtype=object) 类似数据库查询中的groupby查询 先添加新的一列按月将数据划分 聚合,对指定的列按月划分求平均值等 min 最小值 max 最大值 sum

    2024年02月06日
    浏览(52)
  • java中pdfbox处理pdf常用方法(读取、写入、合并、拆分、写文字、写图片)

    方法代码: 测试用例: 2.1写文字 方法代码: 测试用例: A.pdf: A2.pdf: 2.2写图片 方法代码: 测试用例: A.pdf: pic.jpg: A2.pdf: 方法代码: 测试用例: 方法代码: 测试用例: 引用链接: (17条消息) 使用Apache PDFBox实现拆分、合并PDF_似有风中泣的博客-CSDN博客 (17条消息) Java使用P

    2024年02月11日
    浏览(115)
  • Yaml配置文件读取方法

    在日常的代码中,有一些值是配置文件中定义的,这些值可以根据用户的要求进行调整和改变。这往往会写在yaml格式的文件中。这样开放程序给用户时,就可以不必开放对应的源码,只开放yaml格式的配置文件即可。 将配置文件中的值读入程序也非常的简单。 我们先写一个简

    2024年02月11日
    浏览(27)
  • Vector-常用CAN工具 - CANoe迁移常见Port配置问题

            从 CANoe 和 CANalyzer 12.0 SP4 版本开始,以太网 迁移向导 将在必要时自动开始将现有工具配置转换为新的 基于端口的网络访问格式。 尽管大多数现有配置都可以毫无问题地转换,但有些可能不会。如果在迁移过程中遇到问题, 迁移向导 将通过以下可能的问题消息提

    2024年02月07日
    浏览(49)
  • SpringBoot框架——8.MybatisPlus常见用法(常用注解+内置方法+分页查询)

    1.MybatisPlus常用注解:         1.1 当数据库、表名和字段名和实体类完全一致时无需加注解,不一致时:         @TableName指定库名         @TableId指定表名         @TableField指定字段名         1.2 自增主键:         @TableId(type=IdType.AUTO)         private Long id;        

    2024年04月26日
    浏览(32)
  • C#文件读取的全局配置编程方法

    C#怎样在类库或者应用入口从配置文件读取参数,并作用到全局。 面向对象的程序有很多类库分布在很多cs文件,如何全局起作用。 如何从可读可编辑的文本导入配置。 静态类保存全局变量。 json文件保存,可读。Newtonsoft.json 软件导入方便。 关于newtonsoft开源许可:\\\"Json.NET

    2024年02月14日
    浏览(32)
  • 常见的Web安全漏洞有哪些,Web安全漏洞常用测试方法介绍

    Web安全漏洞是指在Web应用程序中存在的可能被攻击者利用的漏洞,正确认识和了解这些漏洞对于Web应用程序的开发和测试至关重要。 一、常见的Web安全漏洞类型: 1、跨站脚本攻击(Cross-Site Scripting,XSS):攻击者通过向Web页面注入恶意脚本来执行恶意操作,例如窃取用户敏感信

    2024年02月11日
    浏览(41)
  • JAVA-9-[SpringBoot]非web应用程序创建和配置文件读取

    SpringBoot 常用读取配置文件的 3 种方法! Spring Boot非web应用程序的创建方式 有时有些项目不需要提供web服务,比如跑定时任务的项目,如果都是按照web项目启动,这个时候会浪费一些资源。 1、Spring CommandLinerunner接口实现booot入口类; 2、run()方法覆盖commandlineruner接口,在run方

    2023年04月08日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包