Skip to main content
今日目标:DevOps 日常工作本质上就是”处理文本”。今天我们将学习如何用 Python 优雅地读写 JSON/YAML 配置文件,并用 正则表达式 (Regex) 提取复杂的日志信息。今天不只是写代码,而是要彻底理解 “为什么 JSON/YAML 是配置的标准格式”“正则表达式如何高效匹配文本” 以及 “如何避免常见的文件处理陷阱”

学习内容 (30 mins)

在开始写代码前,先搞懂这些核心概念,否则后面的代码你会看得云里雾里。
什么是结构化数据?结构化数据是指有固定格式的数据,如 JSON、YAML、CSV。这些格式都有明确的语法规则,便于程序解析。为什么需要不同的数据格式?
  • JSON
    • 优点:轻量级、易读、广泛支持(API 响应、配置文件)
    • 缺点:不支持注释、格式较严格
    • 应用:API 响应、配置文件、数据交换
  • YAML
    • 优点:支持注释、可读性强、支持多行字符串
    • 缺点:缩进敏感、解析较慢
    • 应用:Kubernetes 配置、Docker Compose、CI/CD 配置
  • CSV
    • 优点:简单、Excel 兼容、适合大数据
    • 缺点:不支持嵌套结构、类型推断困难
    • 应用:数据导出、报表生成、数据分析
Python 处理方式
  • JSON:内置库 json,无需安装
  • YAML:第三方库 PyYAML,需要 pip install pyyaml
  • CSV:内置库 csv,无需安装
什么是正则表达式?正则表达式(Regular Expression,简称 Regex)是一种描述字符串模式的语法,用于匹配、查找、替换文本。为什么需要正则表达式?
  • 精确匹配:可以匹配复杂的文本模式(如 IP 地址、邮箱、日期)
  • 批量处理:一次匹配多个模式,比字符串方法更强大
  • 日志分析:从日志中提取关键信息(IP、时间、错误信息)
  • 数据清洗:清理和格式化数据
常用正则模式
  • \d+:匹配一个或多个数字(如:1234567
  • \w+:匹配一个或多个单词字符(字母、数字、下划线)
  • .*?:非贪婪匹配任意字符(尽可能少匹配)
  • \s+:匹配一个或多个空白字符(空格、制表符、换行)
  • ^:匹配字符串开头
  • $:匹配字符串结尾
  • ():捕获组,用于提取匹配的内容
Python 正则方法
  • re.search():查找第一个匹配(返回 Match 对象或 None)
  • re.findall():查找所有匹配(返回列表)
  • re.sub():替换匹配的文本
  • re.match():从字符串开头匹配(类似 ^pattern

代码任务 (90 mins)

1

环境准备

确保虚拟环境已激活,并安装必要的包:
2

任务 A:JSON 文件处理

编写 10_json_demo.py,演示 JSON 的读写操作。
代码解释
  • json.dump():将字典写入文件
  • json.load():从文件读取 JSON 并解析为字典
  • json.dumps():将字典转换为 JSON 字符串
  • json.loads():将 JSON 字符串解析为字典
运行脚本
验证步骤
  1. 检查 config.json 文件是否创建
  2. 查看文件内容:cat config.json
  3. 确认 JSON 格式正确(缩进、引号等)
3

任务 B:YAML 文件处理

编写 10_yaml_demo.py,演示 YAML 的读写操作。
代码解释
  • yaml.safe_load():安全加载 YAML(推荐,防止代码执行)
  • yaml.dump():将字典写入 YAML 文件
  • default_flow_style=False:使用块样式,更易读
运行脚本
验证步骤
  1. 检查 config.yaml 文件是否创建
  2. 查看文件内容:cat config.yaml
  3. 确认 YAML 格式正确(缩进、注释等)
4

任务 C:正则表达式实战

编写 10_regex_demo.py,演示正则表达式的使用。
正则表达式详解
  • \d+:一个或多个数字
  • \.:转义的点号(匹配字面量 .
  • \w+:一个或多个单词字符
  • .*?:非贪婪匹配任意字符
  • ():捕获组,用于提取匹配内容
  • \s:空白字符
运行脚本
验证步骤
  1. 脚本能正常运行,无语法错误
  2. 观察匹配结果是否正确
  3. 确认捕获组提取的内容正确
  4. 确认文本替换功能正常
常见错误
  • re.error: bad escape - 正则表达式转义错误,检查反斜杠
  • AttributeError: 'NoneType' object has no attribute 'group' - 匹配失败返回 None,应先检查
  • ❌ 匹配结果不符合预期 - 检查正则模式是否正确,可以使用在线工具测试

拓展任务 (30 mins)

挑战 1:pathlib 实践

任务:使用 pathlib 库列出当前目录下所有的 .py 文件。提示

挑战 2:日志分析器

任务:编写一个日志分析器,从 Nginx 日志中统计:
  • 每个 IP 的访问次数
  • 每个状态码的出现次数
  • 最常访问的 URL
提示:使用字典存储统计结果,正则表达式提取信息。

今日产出物

  • 10_json_demo.py - JSON 处理示例
  • 10_yaml_demo.py - YAML 处理示例
  • 10_regex_demo.py - 正则表达式示例
  • config.json - 生成的 JSON 配置文件
  • config.yaml - 生成的 YAML 配置文件

参考代码

查看参考代码

在 GitHub 查看完整的示例代码

在线运行

使用在线编辑器测试代码

实际应用场景

文件处理在运维中的应用

  • 配置管理:读取和更新应用配置文件(JSON/YAML)
  • 数据导出:将监控数据导出为 CSV 格式
  • API 集成:解析 API 返回的 JSON 响应
  • 日志分析:从日志文件中提取关键信息

正则表达式在运维中的应用

  • 日志解析:从日志中提取 IP、时间、错误信息
  • 数据清洗:清理和格式化数据
  • 文本替换:批量替换配置文件中的内容
  • 模式匹配:验证输入格式(如邮箱、IP 地址)
与 Day 11 的关联:今天学习的文件处理和正则表达式,明天会学习如何用 Python 调用 Shell 命令(subprocess),将文件处理和系统命令结合起来。

上一天: 数据结构进阶

Day 09 | 数据结构与装饰器

下一天: 系统调用

Day 11 | Python 调用 Shell