news 2026/4/25 15:40:20

python yaml

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
python yaml

### Python与YAML:一个老程序员的实用笔记

最近在整理项目配置文件时,突然想把YAML和Python的那些事儿好好捋一捋。毕竟这个组合太常见了,但用不好会坑得人想摔键盘。

1. YAML是什么

YAML的全称是"YAML Ain’t Markup Language"(YAML不是标记语言),这个自嘲的名字已经说明了一切。它本质上是一种人类可读的数据序列化格式。和JSON、XML这些同行相比,YAML更像是一个强迫症患者写的笔记——通过缩进来表达层级关系,用冒号分隔键值对,用横线表示列表项。

举个最简单的例子,假设我们要描述一个人的信息:

person:name:张三age:28hobbies:-写代码-打游戏-睡觉

看到没有,连引号都不需要,全靠缩进和换行就表达清楚了结构。这种设计哲学很有意思,它假设读这个文件的人更关心“内容看起来什么样”,而不是“结构怎么解析”。

2. 它能做什么

在实际项目中,YAML最常见的用途有四个:

配置文件管理
这是最普遍的应用。Docker Compose的docker-compose.yml、Ansible的playbook、Kubernetes的deployment配置,全部都是YAML格式。它天然适合描述复杂的嵌套配置,比如:

database:host:localhostport:5432pool:min:5max:20timeout:30

数据交换
虽然JSON在这方面更流行,但YAML在某些场景下更有优势。比如多语言翻译文件,因为YAML支持多行字符串,处理长文本比JSON方便得多。

测试数据
单元测试里经常需要构造复杂的数据结构。用YAML写测试用例比Python的字典变量更清晰,特别是当数据嵌套超过三层的时候。

日志解析
有些日志系统会输出YAML格式的结构化日志。在调试时,直接用Python解析比手动翻日志方便十倍。

3. 怎么使用

Python里最常用的YAML库是PyYAML。先装包:

pipinstallpyyaml

基础用法很简单,就两个函数:

importyaml# 读取YAML文件withopen('config.yaml','r')asf:config=yaml.safe_load(f)# 写入YAML文件data={'name':'张三','age':28}withopen('output.yaml','w')asf:yaml.dump(data,f,default_flow_style=False)

这里有个关键点:永远别用yaml.load()。它存在安全漏洞,会执行任意的Python代码。yaml.safe_load()才是生产环境该用的。

处理复杂类型时有些技巧。比如处理时间戳:

importyamlfromdatetimeimportdatetimedeftimestamp_representer(dumper,data):returndumper.represent_scalar('tag:yaml.org,2002:timestamp',data.isoformat())yaml.add_representer(datetime,timestamp_representer)now=datetime.now()yaml.dump({'time':now})
4. 最佳实践

写YAML配置文件要像写Python代码一样讲究,否则迟早会翻车。

缩进用空格,打死不用Tab
YAML对缩进极度敏感,而Tab在不同编辑器里表现不一致。有人因为这个bug排查了三天,最后发现是编辑器把两个空格显示成Tab的样子。所有的编辑器都应该设置:Tab自动转为两个空格。

给字符串加引号要谨慎
数字或者特殊字符可能会被YAML误解。比如version: 1.0会被解析成数字1.0,而version: "1.0"才是字符串。当遇到truefalsenull这些保留字时,不加引号会出大问题:

# 这个会出问题result:true# 安全写法result:"true"

善用锚点和别名
这算是YAML的独门绝技,能避免重复配置:

defaults:&defaultsadapter:postgreshost:localhostdevelopment:database:myapp_development<<:*defaultstest:database:myapp_test<<:*defaults

别嵌套超过三层
虽然YAML支持任意深度嵌套,但超过三层的配置已经很难人工维护了。这时候应该考虑把长配置拆到多个文件里,然后用!include标记(需要自定义加载器)。

5. 和同类技术对比

VS JSON
JSON的优点在于严格和普及。几乎所有语言都有原生JSON解析器,性能也比YAML好(差10倍左右)。但JSON的可读性差,尤其是嵌套结构时,括号地狱让人头疼。写个复杂配置:

{"database":{"host":"localhost","ports":[5432,5433],"pool":{"min":5,"max":20}}}

YAML版本:

database:host:localhostports:[5432,5433]pool:min:5max:20

VS XML
XML现在基本被淘汰了。它的冗余程度太高,解析也麻烦。但它有命名空间、schema验证这些工业级特性,适合那些需要严格数据规范的企业级项目。个人觉得除非是不得不处理旧系统,否则没必要用XML。

VS TOML
这是比较新的格式。它的配置风格类似INI文件,加入了表、数组等更丰富的结构。TOML的类型系统比YAML严格,没有那些让人头疼的类型推断问题。比如在TOML里写version = "1.0",永远是字符串。但TOML的表达能力不如YAML,处理复杂的多层次结构时比较吃力。

实际选择建议
如果是个人项目或者小团队,YAML是很好的选择。但要注意版本控制——YAML解析时的歧义问题比JSON多得多,团队里最好有统一的代码风格规范。如果是做API接口的数据格式,劝你别用YAML,用JSON。解析性能差异还是次要的,关键是前端和各种客户端对YAML的支持太差。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 15:39:12

全栈聚合应用ChattyPlay-Agent:从架构演进到工程化实战

1. 项目概述&#xff1a;一个全栈开发者的“瑞士军刀”是如何炼成的作为一名在前后端领域摸爬滚打了十多年的开发者&#xff0c;我见过也做过不少“聚合型”应用。但像ChattyPlay-Agent这样&#xff0c;能把视频解析、AI对话、金融数据、漫画阅读、论文工具、闲鱼助手等十几个看…

作者头像 李华
网站建设 2026/4/25 15:38:08

深度技术解构:AlphaPlayer视频动画引擎的核心实现原理

深度技术解构&#xff1a;AlphaPlayer视频动画引擎的核心实现原理 【免费下载链接】AlphaPlayer AlphaPlayer is a video animation engine. 项目地址: https://gitcode.com/gh_mirrors/al/alphaplayer AlphaPlayer是一款由字节跳动直播团队开发的高性能视频动画引擎SDK…

作者头像 李华
网站建设 2026/4/25 15:35:21

Python实现机器学习数据标准化与归一化详解

1. 从零开始实现机器学习数据标准化与归一化在机器学习项目中&#xff0c;数据预处理往往决定了模型的成败。我见过太多初学者直接拿原始数据喂给算法&#xff0c;结果模型表现惨不忍睹。今天我要分享的是数据预处理中最基础却至关重要的两个技巧——标准化(Standardization)和…

作者头像 李华
网站建设 2026/4/25 15:32:29

NGA-BBS-Script:3个步骤让你的论坛浏览体验提升200%

NGA-BBS-Script&#xff1a;3个步骤让你的论坛浏览体验提升200% 【免费下载链接】NGA-BBS-Script NGA论坛增强脚本&#xff0c;给你完全不一样的浏览体验 项目地址: https://gitcode.com/gh_mirrors/ng/NGA-BBS-Script 你是否曾经在NGA论坛中迷失在信息海洋里&#xff1…

作者头像 李华