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
相关产品推荐
相关产品推荐

