You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python使用yaml.dump时,冒号加空格为何导致字符串被加引号?

YAML序列化时带空格冒号的字符串自动加引号的原因与解决办法

问题描述

我用Python写了一段爬虫代码,结合requests和BeautifulSoup抓取餐厅及其菜品价格数据,整理成以餐厅名为键、菜品列表为值的字典后,用yaml.dump将其序列化为YAML字符串:

  • 当菜品名称与价格的格式写为name = f'{dish_name} :{price}'时,输出的YAML中菜品条目无引号包裹:
{'text': 'Restaurant_Name:\n- Dish_Name_1 :Price_1\n- Dish_Name_2 :Price_2\n'}
  • 但改成冒号前后都加空格的格式name = f'{dish_name} : {price}'后,每个菜品条目都会被自动加上单引号:
{'text': "Restaurant_Name:\n- 'Dish_Name_1 : Price_1'\n- 'Dish_Name_2 : Price_2'\n"}

试过f-string、字符串join等多种拼接方式,都无法解决这个问题,想知道原因和解决办法。

原因分析

这是YAML语法规则的特性导致的:当字符串中出现冒号后紧跟空格(即:)的结构时,YAML解析器会默认将其识别为键值对的分隔符(比如key: value的格式)。为了避免歧义,PyYAML会自动给这类字符串添加引号,明确标记这是一个纯字符串,防止被误解析为键值结构。

而 :{price}的格式中,冒号后没有空格,不会触发YAML的键值对识别逻辑,所以不需要加引号。

解决办法

要实现冒号前后加空格且不添加引号的效果,需要自定义PyYAML的字符串代表器(representer),强制让包含:的字符串以无引号的纯文本形式输出:

示例代码

import yaml
from yaml.representer import Representer

# 自定义字符串代表器,强制所有字符串以无引号形式输出
def plain_str_representer(dumper, data):
    return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='')

# 注册自定义代表器
yaml.add_representer(str, plain_str_representer)

# 测试用的餐厅数据
restaurant_dict = {
    "Restaurant_Name": [
        "Dish_Name_1 : Price_1",
        "Dish_Name_2 : Price_2"
    ]
}

# 序列化为YAML字符串
result = yaml.dump(restaurant_dict, default_flow_style=False)
print(result)

输出结果

Restaurant_Name:
- Dish_Name_1 : Price_1
- Dish_Name_2 : Price_2

注意事项

这种方式会强制所有字符串以无引号形式输出,需要确保你的字符串中没有其他会触发YAML语法歧义的内容(比如开头是- 、*等特殊字符)。如果后续需要解析该YAML文件,只要字符串本身不包含YAML的特殊语法结构,就不会出现解析错误。

内容的提问来源于stack exchange,提问作者Scentryum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 05:55:12