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

导出含PosixPath成员的对象至YAML时如何处理Path对象

问题:如何将包含PosixPath的对象写入YAML文件?

我有一个包含PosixPath()作为数据成员的对象,想要将其写入YAML文件。目前使用以下代码:

safe_dump_all(data, f_out, indent=2, default_flow_style=False)

但出现了无法表示Path对象的错误:

Type: <class 'yaml.representer.RepresenterError'>
2024-02-29 15:28:18 ERROR    - Value: ('cannot represent an object', PosixPath('/a/b/c')

使用JSON时,我通过编写自定义Encoder解决了该问题,代码如下:

class MyJSONEncoder(JSONEncoder):
    def default(self, o):
        if isinstance(o, Path):
            return os.fspath(o)
        return JSONEncoder.default(self, o)

但不清楚如何在YAML中实现类似操作。


解决方法

在PyYAML中,你需要为Path类型注册自定义表示器(representer),逻辑和JSON自定义Encoder类似,核心是告诉YAML如何将Path对象序列化为合法的YAML元素。

步骤1:定义Path对象的处理函数

这个函数负责把Path对象转换成YAML能识别的标量类型(这里转成字符串):

import os
from pathlib import Path
import yaml

def path_representer(dumper, path_obj):
    # 将Path对象转为字符串,用os.fspath兼容所有Path子类(PosixPath/WindowsPath)
    return dumper.represent_scalar('tag:yaml.org,2002:str', os.fspath(path_obj))

步骤2:注册表示器到SafeDumper

因为你使用的是safe_dump_all,需要将表示器注册到SafeDumper上,确保安全序列化:

yaml.add_representer(Path, path_representer, Dumper=yaml.SafeDumper)

步骤3:正常序列化

现在再调用safe_dump_all就能正确处理Path对象了:

with open('output.yaml', 'w') as f_out:
    yaml.safe_dump_all(data, f_out, indent=2, default_flow_style=False)

补充说明

  • 如果你的代码中同时存在PosixPath和WindowsPath,直接注册基类Path即可,所有子类都会被自动处理。
  • 如果你使用普通的dump/dump_all而非安全模式,只需把注册时的Dumper=yaml.SafeDumper换成Dumper=yaml.Dumper即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 01:17:47