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

Python生成YAML时如何避免长文本自动换行?

问题:YAML长文本自动换行

期望生成的YAML:

version: '3.1'
nlu:
- intent: anxiety_intent
  examples: |
    - my anxiety has been overwhelming lately.
    - i am struggling with my stress levels right now.
    - i'm having a bit of a crisis and not serious, but need to talk just a very long panic attack.

实际生成的YAML(长文本被自动换行):

version: '3.1'
nlu:
- intent: anxiety_intent
  examples: |
    - my anxiety has been overwhelming lately.
    - i am struggling with my stress levels right now.
    - my anxiety has been bad.
    - i'm having a bit of a crisis and not serious, but need to talk just a very long
      panic attack.

问题根源:PyYAML默认会对超过80字符的文本触发自动换行,同时原代码依赖yaml.dump(val)生成例子内容时,也会触发该换行逻辑。

修改方案

需要两处关键调整:

  1. 手动构建examples的列表字符串,摆脱yaml.dump的自动换行限制
  2. 在最终导出YAML时设置无限宽度,彻底禁止所有自动换行行为

修改后的完整代码:

import yaml
import os
import pandas as pd
from yaml.resolver import BaseResolver

class AsLiteral(str):
    pass

def represent_literal(dumper, data):
    return dumper.represent_scalar(BaseResolver.DEFAULT_SCALAR_TAG, data, style="|")

yaml.add_representer(AsLiteral, represent_literal)

##########################################################################
###################### INTENT FUNCTIONS ##################################
##########################################################################

def generate_intent_dict(worksheet):
    rows = worksheet.get_all_records()
    df = pd.DataFrame(rows)
    all_intent_list = {col : [x for x in df[col].values if x != ''] for col in df}
    filtered_intent_list = {k: v for k, v in all_intent_list.items() if v}
    return filtered_intent_list

def generate_yaml_specific_intent_dict(intents_dict):
    yaml_dict = {
        "version" : "3.1",
        "nlu" : [],
    }

    for k, val in intents_dict.items():
        d1 = dict()
        d1['intent'] = k 
        # 手动拼接例子行,确保每个文本完整无换行
        examples_content = "\n".join([f"- {line}" for line in val])
        d1['examples'] = AsLiteral(examples_content)
        yaml_dict['nlu'].append(d1)
    return yaml_dict
    

##########################################################################
###################### FILE SAVING FUNCTIONS #############################
##########################################################################

def yaml_specific_intent_write(yaml_dict, path, fname):
    with open(os.path.abspath(path + fname), 'w') as f:
        # 设置无限宽度,禁用所有自动换行
        yaml.dump(yaml_dict, f, sort_keys=False, width=float('inf'))
核心修改说明
  • 手动拼接examples内容:直接遍历每个输入文本,生成- 文本格式的独立行,完全规避yaml.dump的自动换行逻辑
  • 设置width=float('inf'):强制PyYAML保留所有文本的原始格式,不再根据字符长度切割换行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 21:43:35