使用PyYAML Representer时控制折叠字符串的换行长度
控制PyYAML折叠字符串的换行长度
好问题!PyYAML本身并没有直接给折叠字符串(>风格)提供单独的换行长度配置项,但我们有两种方法可以实现你想要的“每行约70字符换行”的需求,下面详细说明:
方法1:利用yaml.dump()的width参数
PyYAML的dump()方法自带一个width参数,它可以控制输出文本的整体换行宽度——对于折叠风格的字符串来说,PyYAML会根据这个宽度自动拆分内容,同时尽量保证不拆分空格分隔的单词。
修改你的代码,在dump()时加入width=70即可:
import yaml class folded_str(str): pass def folded_str_representer(dumper, data): return dumper.represent_scalar(u'tag:yaml.org,2002:str', data, style='>') yaml.add_representer(folded_str, folded_str_representer) data = { 'foo': folded_str(('abcdefghi ' * 10) + 'end\n'), } # 通过width参数控制换行宽度 print(yaml.dump(data, width=70))
这个方法简单直接,不需要额外处理字符串;但要注意,如果你的字符串包含无空格的超长连续字符(比如一串没有空格的长单词),PyYAML还是会强制在width设置的位置拆分。
方法2:手动预处理字符串(精确控制换行)
如果需要严格按照70字符换行,或者想自定义单词拆分规则,你可以先手动把字符串拆分成指定长度的行,再传入折叠字符串类中:
import yaml class folded_str(str): pass def folded_str_representer(dumper, data): return dumper.represent_scalar(u'tag:yaml.org,2002:str', data, style='>') yaml.add_representer(folded_str, folded_str_representer) # 自定义字符串拆分函数,按指定宽度分割,可保留单词完整性 def split_str_to_width(s, target_width=70): lines = [] current_pos = 0 str_len = len(s) while current_pos < str_len: # 先截取到目标宽度位置 end_pos = min(current_pos + target_width, str_len) # 如果不是最后一行,尽量找到最近的空格拆分,避免截断单词 if end_pos < str_len: space_pos = s.rfind(' ', current_pos, end_pos) if space_pos != -1: end_pos = space_pos lines.append(s[current_pos:end_pos].strip()) current_pos = end_pos + 1 return '\n'.join(lines) # 预处理字符串后再传入 long_str = ('abcdefghi ' * 10) + 'end\n' data = { 'foo': folded_str(split_str_to_width(long_str, target_width=70)), } print(yaml.dump(data))
这个方法能让你完全控制换行的位置,既可以选择严格按字符数拆分,也可以保留单词完整性,灵活性更高。
总结
PyYAML本身支持通过width参数间接控制折叠字符串的换行长度,如果需要更精确的定制,手动预处理字符串是可靠的解决方案。
内容的提问来源于stack exchange,提问作者Lone Learner
相关产品推荐
相关产品推荐

