真香!超全,Python中常见的配置文件写法!转载

原创
小哥 3年前 (2022-10-17) 阅读数 51 #大杂烩

在开发过程中,我们经常使用一些固定的参数或常量。对于这些比较固定和常用的部件,通常会写入固定的文件,以避免在不同的模块代码中重复出现,从而保持核心代码的整洁。

这个固定文件,我们可以直接写成这个固定文件,我们可以写成一个固定文件,我们可以直接写成一个固定文件 .py 文件,如文档 settings.pyconfig.py 这样做的好处是有可能通过 import 来导入其中的部件;但如果我们需要导入其他 非 Python 的平台 在进行配置文件共享时,写入单条配置文件共享时,写入单条 .py 这不是一个好的选择。这不是一个好的选择。这不是一个好的选择。这不是一个好的选择。

这是我们应该选择通用配置文件类型作为存储这些固定部件的一种方式的地方。目前常用和流行的配置文件格式的主要类型有 inijsontomlyamlxml 等,这些类型的配置文件我们可以通过标准库或第三方库来解析。

ini

ini 即 Initialize 在早期,初始化的意义在 Windows 上的配置文件的存储格式 ini 这些文件以易于理解且往往简单的方式编写,通常由以下部分组成(Section)、键(key)和值(value)组成,如以下形式。)是这样组成的,如下面的形式。)是由以下形式组成的。

[localdb]
host     = 127.0.0.1
user     = root
password = 123456
port     = 3306
database = mysql

Python 它自己内置的内置的内置 configparser 标准库,我们可以直接将它用于标准库,我们可以直接将它用于 ini 用于解析的文件。如果我们将上述内容保存在一个名为 db.ini 在文件中,然后使用 read() 方法进行分析和读取,并最终将 items() 方法以获取指定节点下的所有键-值对。

>>> from configparser import ConfigParser
>>> cfg = ConfigParser()
>>> cfg.read("/Users/Bobot/db.ini")
[/Users/Bobot/db.ini]
>>> cfg.items("localdb")
[(host, 127.0.0.1), (user, root), (password, 123456), (port, 3306), (database, mysql)]

值得注意的是,必须指出的是,注意到 configparser 默认将值 以字符串的形式作为字符串的形式 演示,这就是为什么我们在渲染,这就是为什么我们在渲染,这就是为什么我们在演示,所以这就是为什么我们 db.ini 将文字数量直接写在文件顶部而不是引号是有原因的。

在获得键-值对之后,我实际上将其直接转换为字典,然后通过解包将引用串行化,使代码保持简单:

#!pip install pymysql
import pymysql
from configparser import ConfigParser

cfg = ConfigParser()
cfg.read("/Users/Bobot/db.ini")
db_cfg = dict(cfg.items("localdb"))

con = pymysql.connect(**db_cfg)

json

json 该格式可以说是一种常见的文件格式,是目前互联网上流行的数据交换格式。除此之外, json 有时,它也是一种个人资料。有时,它也是一种个人资料。有时,它是一种个人资料。

比如 npm (JavaScript 包管理工具类似于包管理工具类似包管理工具类似于包管理工具 Python 的 pip )和微软现在广泛使用的),以及微软现在广泛使用的 VSCode 编辑器,都使用编辑器,都使用 json 写入配置参数。正在写入配置参数。写入配置参数。写入配置参数。

configparser 一样,Python 也内置了 json 标准库,可以通过 load()loads() 方法导入文件样式和字符串方法导入基于文件和基于字符串的方法导入类文件和字符串方法导入基于文件和字符串 json 内容。

{
    "localdb":{
        "host": "127.0.0.1",
        "user": "root",
        "password": "123456",
        "port": 3306,
        "database": "mysql"
    }
}

我们将上述内容保存为保存上述内容,因为我们已将上述内容保存为 db.json 在阅读和解析之后。在阅读和分析之后,在阅读和分析之后。 json 库读取 json 这些文件相对简单,易于解析 Python 字典对象的。字典对象的。字典对象。

>>> import json
>>> from pprint import pprint
>>> 
>>> with open(/Users/Bobot/db.json) as j:
...     cfg = json.load(j)[localdb]
... 
>>> pprint(cfg)
{database: mysql,
 host: 127.0.0.1,
 password: 123456,
 port: 3306,
 user: root}

使用 json 文件配置的缺点是语法标准受到严格限制,其中一个批评是 无法在其中写入备注无法在其中写入备注无法在其中写入备注 除非被拿走除非被拿走除非你拿走 json 其他类型的其他类型 超集 作为替代方案(VSCode 可以在中写入注释的可以在中写入批注的可以在中写入备注的 json (参数配置文件是备选方案之一);两者都存在 嵌套过深 问题是,它很容易导致错误,不应该用来写入过长或复杂的参数配置信息。

toml

toml 格式(或 tml 格式)是 Github 联合创始人联合创始人 Tom Preston-Werner 建议的配置文件格式。根据维基百科的说法, toml 它的首次提出是在它第一次提出的时候 2013年7一个月,七年前;它在某些方面也类似于稍后讨论的那个 yaml 文件有些相似,但如果你知道什么时候文件有些相似,但如果你知道 yaml 当规范有几十页时(没错,它确实有几十页……),您可能不会真的想要编写如此复杂的配置文件。 toml 格式是一个很好的选择。格式是一个很好的选择。格式是一个很好的选择。

toml 格式大致如下。格式大致如下。

01-toml样式

从这里你可以看到,你可以从这里看到,你可以从这里看到 toml 有点像前面说的话有点像前面提到的有点像前面说的 ini 文件。但这比 ini 扩展到包含更多内容。扩展了更多的内容。扩展以获得更多内容。扩展了更多内容。

正如我们在示例图像中看到的,除了时间戳、布尔值、数组等基本字符串之外,还进一步支持样式和 Python 他的母语写作风格非常相似。与当地的写作风格非常相似。

当然,这里不会介绍太多,我们不会在这里介绍太多 toml 对于一些规格说明的格式,有人已经翻译了官方的规格文件,有兴趣的人士可以直接参考。

这么契合 Python 已经有开发人员为配置文件类型构建了相应的“车轮”。 Github 上 Stars 最大的数字是最高的数字是 uiri/toml 版本,但此版本只通过了版本,但它只通过了版本,尽管它只通过了 v0.5 版本 toml 规范,但它在使用上仍然相当简洁,我们可以使用 pip 安装命令用于安装的命令

pip install toml

库的解析很简单,有点类似于 json 库的解析使用,即通过 load()loads() 转换和导出也是如此。转换和出口也是如此。

例如,我们现在编写以下代码以 config.toml 中:

[mysql]
host     = "127.0.0.1"
user     = "root"
port     = 3306
database = "test"

  [mysql.parameters]
  pool_size = 5
  charset   = "utf8"

  [mysql.fields]
  pandas_cols = [ "id", "name", "age", "date"]

紧接着我们可以通过紧接着之后我们可以紧接着之后我们可以使用 toml 库中的 load() 方法进行读取。方法进行读取。方法来执行读取。方法来执行读取。

>>> import toml
>>> import os
>>> from pprint import pprint
>>> cfg = toml.load(os.path.expanduser("~/Desktop/config.toml"))
>>> pprint(cfg)
{mysql: {database: test,
           fields: {pandas_cols: [id, name, age, date]},
           host: 127.0.0.1,
           parameters: {charset: utf8, pool_size: 5},
           port: 3306,
           user: root}}

可以看到 toml 文件被间接转换为字典类型,这当然是 json 编写版本(只需将单引号替换为双引号),以方便我们随后的调用或传递引用。

yaml

yaml 格式(或 yml 格式)是当今可用的较流行的配置文件之一,它从 2001 由一家公司打电话给一家名为 Clark Evans 谁提出的;它也是目前广泛使用的配置文件类型,通常 Docker 容器里的 docker-compose.yml 配置文件,如果是经常使用的配置文件,如果是经常使用的配置文件,如果是经常使用的配置文件,如果是经常使用的 Docker 那些部署的人不会忘记这一点。

yaml 文档的设计从以下开始 Python、XML 等来获得灵感,这样你在使用时就可以清楚地看到这些部件的影子。

在上一节 toml 我已经在我提到的内容中提到了我在我在内容中提到的内容中提到了 yaml 该规范的内容可以用冗长和复杂来形容,具有完整的80页数(豆尊威力,恐怖如……)。

02-yaml规范页数

因此,感兴趣的人可以自己了解更多的用法。

YAML 官员们早就提供了相应的官员早就提供了适当的 Python 库为支持,即库为支持,即库由 PyYAML 当然,我们以前的安装也是如此。

pip install pyyaml

json 库和 toml 图书馆,就像图书馆,就像图书馆一样,就像 load() 方法进行加载。方法进行加载。加载方法。方法来加载它。

值得注意的是,必须指出的是,注意到使用 load() 方法 会有一定的安全隐患会有一定的安全隐患会有一定的安全隐患 ,从思科 Talos 在这份报告中,我们可以看到,如果未知或不受信任的 yaml 文件,则可能存在攻击风险和网络安全风险,因为它可以直接调用相应的 Python 函数执行攻击者所需的命令,例如,在 yaml 在文件中,写下这一段。文件中包含这一段。

# 使用Linux和macOS如果你是朋友,不要轻易尝试如果你是朋友,不要轻易尝试
!!python/object/apply:os.system ["rm -rf /"]

因此最好使用,因此最好使用 safe_load() 来代替 load() 方法。

这和 Python 内置的 string 标准库中 Template 类的 substitute() 模板方法具有相同的安全风险,因此请使用 safe_substitute() 替换是一回事。替换也是同样的原因。替换也是一回事。更换也是同样的原因。

如果我们现在将以前的一些配置信息写入 config.yaml 文件中:

mysql:
  host: "127.0.0.1"
  port: 3306
  user: "root"
  password: "123456"
  database: "test"

  parameter:
    pool_size: 5
    charset: "utf8"

  fields:
    pandas_cols: 
      - id
      - name
      - age
      - date

然后我们通过然后我们通过我们然后通过 safe_load() 解析的方法。方法进行解析。用于解析的方法。

>>> import os
>>> from pprint import pprint
>>> 
>>> with open(os.path.expanduser("~/config.yaml"), "r") as config:
...     cfg = yaml.safe_load(config)
... 
>>> pprint(cfg)
{mysql: {database: test,
           fields: {pandas_cols: [id, name, age, date]},
           host: 127.0.0.1,
           parameter: {charset: utf8, pool_size: 5},
           password: 123456,
           port: 3306,
           user: root}}

您可以看到,最终结果与前一次相同 toml 库的解析结果基本相同。

结尾

本文列出了一些主流和常见的配置文件类型及其 Python 有些读者可能会发现没有,有些读者可能会发现没有 xml 格式类型内容。为 xml 配置文件可能与配置文件不同,配置文件可能与 Java 语言系会遇到更多与语言打交道的朋友,但 xml 文件的可读性确实令人望而生畏;因为 xml 对于那些不知道该文件的人,您可以使用 Chrome 浏览器进入任意网站并按下浏览器进入任意站点并按下 F12 进入开发人员并查看密集的 html 元素便是 .xml 的缩影。

除了这些主流配置文件类型之外,还有一些 .cfg.properties 等可以用作配置文件,甚至,如开头所述,您可以使用单独的 .py 将各种配置信息写成配置文件导入是可以的,但在跨语言共享时可能会有一些障碍。因此,本文不会涉及太多内容,因此如果您感兴趣,您可以自己了解更多。

本文中列出的配置文件类型从上到下增加了复杂性。 ini < json ≈ toml < yaml 您可以根据您的实际需求和团队合作需求在它们之间进行选择。

来源:Web来源:Network来源:Internet来源:Web

推荐阅读:
入门: 最完整的零基学习最全面的零基学习最完整的零基学习Python的问题  | 从零开始学习从零基础学习从零基础学习8个月的Python  | 实战项目 |学Python这是捷径,这是捷径,这是捷径
干货:爬行豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析最佳球员分析 |   从万众期待到口碑惨败!唐探3令人失望  | 笑新伊田图龙记笑新伊田图龙记笑新伊田图龙记 | 谜语之王回答灯谜之王灯谜之王谜语之王 |用Python人山人海素描图人山人海素描图人山人海 Dishonor太火了,我用机器学习做了一个迷你推荐系统电影
趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python日常酷跑游戏日常酷跑游戏日常酷跑游戏!
AI: 会写诗的机器人会写诗的机器人会写诗的机器人 | 给图片上色给图片上色给图片上色 | 预测收入 | 《耻辱》太火了,我用机器学习做了一部迷你推荐系统电影
小工具: Pdf转Word易于修复表单和水印!易于处理的表单和水印!易于修复表单和水印!简单的表格和水印! | 一键把html将页面另存为网页另存为网页另存为pdf!|  再见PDF提款费!提款费!提款费!提款费用! | 用90构建最强大的代码行构建最强大的代码行构建最强大的代码行PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一个固定的低成本机票提醒!制作一张别针的低价机票提醒! |60代码行做了一个语音墙纸切换,天天见女士!

年度弹出文案年度弹出文案年度爆炸性文案

  • 1). 卧槽!Pdf转Word用Python轻松搞定 !

  • 2).学Python闻起来好香!我用100一行代码做了一个网站,帮助人们做了一行代码,做了一个网站,帮助了人们做了一行代码,帮助了人们PS旅行图片赚鸡腿吃旅行图片赚鸡腿

  • 3).第一次播放量过亿,火爆全网,我分析了《波妹》,发现了这些秘密

  • 4). 80一行行代码!使用Python字典操作,今天在这篇文章中展示一些常用的操作在优化中的实现方式,如果你已经掌握了,那么恭喜你,你已经超越了A梦分身

  • 5).你必须掌握的东西你必须掌握20个python我们将以下序列转换为我们将下面的序列转换为我们将以下序列转换为

  • 6). 30个Python普通文体普通文体普通文体

  • 7). 我总结的80使用字典派生工具快速生成字典。Python精选干货.pdf》,都是干货

  • 8). 再见Python!我要学Go了!2500词深度分析词深度分析词深度分析 !

  • 9).发现了一只舔狗的福利!这Python普通文体普通文体普通文体

点击阅读原文点击查看点击点击阅读点击阅读原文点击查看B站我的20个视频!

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门