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)生成例子内容时,也会触发该换行逻辑。
修改方案
需要两处关键调整:
- 手动构建examples的列表字符串,摆脱
yaml.dump的自动换行限制 - 在最终导出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
相关产品推荐
相关产品推荐

