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

Python读写YAML文件触发AttributeError问题求助

解决YAML修改时的AttributeError和TypeError问题

兄弟,你的问题主要出在两个核心误区:一是把简单的字典操作复杂化,非要转成字符串用正则处理;二是yaml.dump的参数传错了,直接导致了AttributeError。咱们一步步拆解解决:

核心错误分析

  1. yaml.dump参数传错:
    你写的yaml.dump(text, path, ...)里,第二个参数要求是可写入的文件对象,但你传了字符串格式的文件路径path。字符串本身没有write方法,这就是报错'str' object has no attribute 'write'的直接原因。

  2. 没必要把字典转成字符串:
    YAML加载后得到的是标准Python字典(比如{'my string': 'something', 'string2': 'something else'}),直接修改字典的键值对才是最合理的方式,转成字符串再用正则替换完全是多此一举,还会引发后续的类型错误。另外你正则里写的my_string是下划线,而原YAML的键是my string(带空格),就算转字符串也匹配不到目标内容。

正确的实现代码

直接对加载后的字典做修改,再正确调用yaml.dump写入文件:

import yaml
import glob
from yaml import CLoader as Loader, CDumper as Dumper
import io

list_paths = glob.glob("my_path/*.yaml")
for path in list_paths:
    with open(path, 'r') as stream:
        try:
            # 加载YAML为字典,全程保持字典类型
            data = yaml.load(stream, Loader=Loader)
            # 直接修改目标键对应的值
            if "my string" in data:
                data["my string"] = "this is my string"
        except yaml.YAMLError as exc:
            print(exc)
            # 加载出错时跳过当前文件的写入
            continue
    
    # 把打开的文件对象传给yaml.dump,不是字符串路径
    with io.open(path, 'w', encoding='utf8') as outfile:
        yaml.dump(data, outfile, default_flow_style=False, allow_unicode=True)

你之前尝试方案的问题解释

  • 方案1(不转字符串但用正则):re.search只能处理字符串,但你传入的是字典对象,自然会触发TypeError: expected string or buffer——这完全是走错了路,直接操作字典才是YAML修改的正确姿势。
  • 方案2(转字符串再转回字典):字典转成字符串后格式是类似"{'my string': 'something'}",直接用dict(text)会失败,因为dict()需要的是键值对组成的可迭代对象,而字符串是按单个字符迭代的,所以会报ValueError。

这样修改后,就能精准把YAML里的my string值改成你想要的内容,同时避免所有报错啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:31:12