Python读写YAML文件触发AttributeError问题求助
解决YAML修改时的AttributeError和TypeError问题
兄弟,你的问题主要出在两个核心误区:一是把简单的字典操作复杂化,非要转成字符串用正则处理;二是yaml.dump的参数传错了,直接导致了AttributeError。咱们一步步拆解解决:
核心错误分析
yaml.dump参数传错:
你写的yaml.dump(text, path, ...)里,第二个参数要求是可写入的文件对象,但你传了字符串格式的文件路径path。字符串本身没有write方法,这就是报错'str' object has no attribute 'write'的直接原因。没必要把字典转成字符串:
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
相关产品推荐
相关产品推荐

