Python常用模块:.ini、.yaml、.toml

发布时间:2026/5/23 5:13:05

Python常用模块:.ini、.yaml、.toml 一、.ini一个ini文件由多个段section组成每个段的名字都是自定义的每个段section中以keyvlaue的形式组成。importosimportconfigparser config_pathos.path.join(os.path.dirname(__file__),config/config.ini)print(config_path)configconfigparser.ConfigParser()config.read(config_path,encodingutf-8)# 读取方式一urlconfig[login][url]# 读取方式二get读取的是strusernameconfig.get(login,username)portconfig.getint(mysql,port)timesconfig.getfloat(common,times)is_devconfig.getboolean(login,dev)# 读取所有段sectionsconfig.sections()# 读取一个sectionmysql_listconfig.items(mysql)# 添加一个段config.add_section(result)config.set(result,success,true)config.write(open(config_path,modew))二YAML 换行→空格末尾保留 1 个 \n | 保留换行原样 - 换行→空格去掉末尾换行chomp经验法则写自然语言段落型 prompt 用 写 few-shot、JSON 模板、需要换行的指令用 |。# llm-config.yamlmodel:provider:anthropicname:claude-opus-4-7temperature:0.7max_tokens:4096# system prompt用 折叠写起来像段落发给模型时是一行system_prompt:你是一个专业的代码评审助手擅长 Python、TypeScript 和 Go。 评审时关注安全漏洞、性能问题、代码可读性。 始终用中文回复并给出具体的修改建议。# user prompt 模板保留换行用 |因为 few-shot 示例需要分行prompt_template:|问题{question}请按以下步骤回答 1. 理解问题 2. 给出方案 3. 提供代码示例# 较长的描述用 - 去掉末尾换行description:-这是一个面向企业内部的 RAG 问答系统 接入公司知识库支持多轮对话和引用溯源。importyamlfromutils.path_toolimportget_abs_pathdefload_rag_config(config_path:strget abs_path(config/agent.yml),encoding:strutf-8):withopen(config_path,r,encddingencoding)asf:returnyaml.load(f,Loaderyaml.FullLoader)三、.toml1. TOML 是什么TOMLTom’s Obvious, Minimal Language是一种为人类阅读优化的配置文件格式。它的设计目标只有一句话写起来像 INI 一样直观读起来比 JSON 更友好结构上比 YAML 更不容易踩坑。如果你写过 Rust 的Cargo.toml、Python 的pyproject.toml、Hugo 的config.toml那么你已经在用它了。近几年 TOML 几乎成为新一代工具链的事实标准配置格式。JSON、YAML、INI 都有一定的缺点TOML 在这三者之间找到了平衡点规则少、类型明确、对人友好、对机器无歧义。格式痛点JSON不能写注释逗号、引号严苛不适合人写YAML缩进敏感同一份文件可能被解析成多种含义规范过于复杂INI没有统一规范不支持嵌套、数组、类型2. 文件基本约定文件后缀.toml编码必须是UTF-8大小写敏感行尾换行符 LF (\n) 或 CRLF (\r\n) 都允许空白与缩进无意义这是和 YAML 最大的区别注释以#开头可写在行首或行尾# 这是一行注释 title TOML 示例 # 行尾注释也允许3. 键值对Key/ValueTOML 的最小单位是键值对key value规则一行只能写一个键值对等号两侧的空格可有可无值必须是合法的 TOML 类型下文详述每个键必须有值——没有裸键或空值这种概念3.1 键名Keys的三种写法# 1. 裸键(Bare Key):只允许 A-Z a-z 0-9 _ - name Alice user_id 42 api-key xxx # 2. 字符串键(Quoted Key):用 或 包起来,可以包含任意字符 127.0.0.1 localhost 中文键 也合法 literal key 原样字符串作键名 # 3. 点分键(Dotted Key):用 . 创建嵌套结构,等价于嵌套表 server.host localhost server.port 8080 # 等价于: # [server] # host localhost # port 8080⚠️注意同一个键不能在同一作用域里被重复定义否则解析器报错。4. 字符串StringTOML 提供4 种字符串对应是否多行和是否转义两个维度单行多行基本支持转义......字面量原样......4.1 基本字符串用双引号包围支持常见转义字符greeting Hello\tWorld\n path C:\\Users\\Alice emoji ❤ # ❤支持的转义序列\b \t \n \f \r \ \\ \uXXXX \UXXXXXXXX。4.2 多行基本字符串description 这是一段 多行文本, 开头的换行会被自动去掉。\ 反斜杠换行可以续行,\ 所以这一段最终是一行。 4.3 字面量字符串推荐写正则、Windows 路径用单引号不解释任何转义regex \d{3}-\d{4} # 不需要写成 \\d{3}-\\d{4} windows_path C:\Users\Alice # 反斜杠原样保留4.4 多行字面量字符串sql SELECT * FROM users WHERE name Alice 5. 数字与布尔5.1 整数Integerint1 99 int2 -17 int3 42 int4 1_000_000 # 下划线分隔,提升可读性 hex 0xDEADBEEF oct 0o755 bin 0b110101105.2 浮点数Floatflt1 3.14 flt2 -0.001 flt3 1e10 flt4 6.626e-34 flt5 1_000.123_456 # 同样支持下划线分隔 # 特殊值 inf inf ninf -inf nan nan5.3 布尔Boolean只有两个值必须小写enabled true debug false6. 日期与时间TOML 是少数原生支持日期类型的配置格式遵循 RFC 3339# 1. 带时区的日期时间(Offset Date-Time) dt1 2026-05-08T14:30:0008:00 dt2 2026-05-08T06:30:00Z # Z 表示 UTC # 2. 本地日期时间(Local Date-Time, 不带时区) dt3 2026-05-08T14:30:00 # 3. 仅日期(Local Date) d 2026-05-08 # 4. 仅时间(Local Time) t 14:30:00.123不需要任何引号包围——这是 TOML 与 JSON/YAML 最显著的差异之一。7. 数组Array数组用方括号[]元素间逗号分隔ports [80, 443, 8080] hosts [alpha, beta, gamma] mixed_ok [1, 2, 3] # 推荐:同质类型 mixed_too [1, two, 3.0, true] # 也允许:TOML 1.0 起放宽了限制 # 多行数组,允许尾随逗号 contributors [ Alice aliceexample.com, Bob bobexample.com, Carol carolexample.com, # 尾随逗号合法 ] # 嵌套数组 matrix [[1, 2], [3, 4], [5, 6]]8. 表TableTOML 的灵魂表Table就是其他语言里的对象、字典、Map。它是 TOML 表达嵌套结构的核心机制。8.1 标准表用[表名]声明之后所有键值对都属于这个表直到下一个表头出现title 全局键放在最前面 [database] host localhost port 5432 user admin [server] bind 0.0.0.0 port 8080等价于 JSON{title:全局键放在最前面,database:{host:localhost,port:5432,user:admin},server:{bind:0.0.0.0,port:8080}}最佳实践所有裸键值对都写在文件最顶部表头之后的内容全部归属对应表。如果把全局键写在表头下面会被错误地划进那个表。8.2 嵌套表点分表名[servers.alpha] ip 10.0.0.1 role frontend [servers.beta] ip 10.0.0.2 role backend等价于{servers:{alpha:{ip:10.0.0.1,role:frontend},beta:{ip:10.0.0.2,role:backend}}}8.3 内联表Inline Table适合短小、扁平的对象类似 JSON 风格point { x 1, y 2 } person { name Alice, age 30 } # 内联表必须写在一行内,不能跨行,且一旦写完就封闭—— # 不能再用 person.email ... 往里面追加键等价于{point:{x:1,y:2},person:{name:Alice,age:30}}9. 表数组Array of Tables要表达一组同构对象比如多个用户、多个依赖、多个产品用双方括号[[...]][[products]] name Hammer sku 738594937 [[products]] name Nail sku 284758393 color gray [[products]] name Saw sku 192847465等价于{products:[{name:Hammer,sku:738594937},{name:Nail,sku:284758393,color:gray},{name:Saw,sku:192847465}]}每出现一次[[products]]就向products数组里追加一个新元素。表数组里的子表[[users]] name Alice [users.address] city Beijing zip 100000 [[users]] name Bob [users.address] city Shanghai zip 200000等价于{users:[{name:Alice,address:{city:Beijing,zip:100000}},{name:Bob,address:{city:Shanghai,zip:200000}}]}子表的缩进仅为可读性TOML 不要求缩进。但子表头必须写在对应的[[users]]之后、下一个[[users]]之前否则归属会错。10. 一份贴近实战的完整示例# # myapp.toml — 应用配置示例 # title MyApp version 1.2.0 [owner] name Alice Wang dob 1990-07-15T09:00:0008:00 [database] host 127.0.0.1 port 5432 connection_max 100 enabled true allowed_ips [10.0.0.1, 10.0.0.2, 10.0.0.3] [database.credentials] user admin password s3cret [logging] level info outputs [stdout, file] file { path /var/log/myapp.log, max_size_mb 100 } [[features]] name dark-mode enabled true [[features]] name beta-search enabled false rollout 0.05 [[servers]] name alpha ip 10.0.0.1 [[servers]] name beta ip 10.0.0.211、容易踩的 5 个坑1. 全局键被误归到表里[server] host localhost title MyApp # ❌ 这个 title 会被解析成 server.title✅ 修复把全局键移到所有表头之上。2. 重复定义同一张表[server] host a [server] # ❌ 报错:server 被定义两次 host b✅ TOML 禁止重复定义同名标准表。如果想要多个用[[...]]表数组。3. 内联表不可事后追加point { x 1, y 2 } point.z 3 # ❌ 报错:内联表声明后即封闭✅ 修复要么写完整{ x 1, y 2, z 3 }要么改用标准表[point]。4. 字符串混淆path C:\Users\Alice # ❌ \U 会被当作 Unicode 转义,通常报错✅ 修复用字面量字符串C:\Users\Alice或转义C:\\Users\\Alice。5. 日期不要加引号created 2026-05-08 # ⚠️ 这是字符串,不是日期 created 2026-05-08 # ✅ 这才是 TOML 的 Local Date 类型如果下游程序按日期类型读取引号版本会拿到字符串导致类型错误。12、TOML vs JSON vs YAML 速查维度TOMLJSONYAML注释✅#❌✅#缩进敏感❌❌✅最大坑点原生日期类型✅❌✅但跨实现不一致数字下划线分隔✅1_000_000❌❌多种字符串语法✅4 种❌仅一种✅多种跨实现一致性高高低同样文本可能解析出 yes/no/true/false适合规模中小型配置数据交换复杂层次配置学习曲线半小时上手几分钟看似简单实际坑多经验法则机器之间传数据用 JSON人写配置用 TOML只有当你确实需要锚点、引用、复杂结构时才用 YAML。13、各语言的 TOML 库语言推荐库Rust标准生态tomlcratePython3.11 内置tomllib只读写入用tomli-w或tomlkitGogithub.com/BurntSushi/toml或github.com/pelletier/go-toml/v2Node.js / TypeScriptiarna/toml或smol-tomlJavatomljC/Ctomlplusplus完整列表见官方维护的清单https://github.com/toml-lang/toml/wiki。14、写在最后TOML 的设计哲学可以浓缩成一句话最少的规则、最明确的类型、最不挑剔的人。它不会取代 JSON 在数据交换里的位置也不会取代 YAML 在 Kubernetes、Ansible 里的生态。但只要你在写人会反复打开来手动改的配置文件TOML 几乎都是更省心的那个选择。下次新建config.json之前不妨先想想要不要换成config.toml

相关新闻