Python 如何以人类可读的格式写入yaml文件?

Python 如何以人类可读的格式写入yaml文件?,python,file,serialization,yaml,pickle,Python,File,Serialization,Yaml,Pickle,我需要编写一些数据类型: a。numpy阵列的列表,例如不同大小的[ndarray,ndarray,ndarray] b。任意numpy数组,例如np.zero((5,6))、np.randn((76,2))等等 c。我还没有想到的任何其他未来数据类型 要求: 我需要一个函数来保存所有这些数据类型,无需特定的处理,并且具有上述类型c的未来兼容性 我还需要输出文件转储为人类可读的格式 到目前为止,我只能用YAML或pickle实现需求1,这两种方法都是用二进制文件实现的,即不是人类可读的 @sta

我需要编写一些数据类型:

a。numpy阵列的列表,例如不同大小的
[ndarray,ndarray,ndarray]

b。任意numpy数组,例如
np.zero((5,6))、np.randn((76,2))
等等

c。我还没有想到的任何其他未来数据类型

要求:

  • 我需要一个函数来保存所有这些数据类型,无需特定的处理,并且具有上述类型c的未来兼容性

  • 我还需要输出文件转储为人类可读的格式

  • 到目前为止,我只能用YAML或pickle实现需求1,这两种方法都是用二进制文件实现的,即不是人类可读的

    @staticmethod
    def _read_with_yaml(path):
        with open(path, 'r') as stream:
            return yaml.load(stream)
    
    @staticmethod
    def _write_with_yaml(path, obj):
        with io.open(path, 'w+', encoding='utf8') as outfile:
            yaml.dump(obj, outfile, default_flow_style=False, allow_unicode=True)
    
    此示例代码输出非人类可读的文件,但适用于我拥有的数据类型


    是否有办法同时满足这两项要求?不,您的要求无法满足

    您已经有一个保存所有这些数据类型的函数
    yaml.dump()
    。正如您所注意到的,对于numpy数据结构,它的可读性不高。这是由于numpy没有针对其特殊数据结构的转储例程,而是返回到可读性较差的默认值
    !python….
    标记了数据结构的转储。现在,您(或YAML或Numpy包维护人员)可以为那些以更可读的格式转储的对象提供特殊的例程,因此可以涵盖这些例程。您可以使YAML库中的representer更加智能化,并在不涉及Numpy类的情况下为Numpy数据结构获得更可读的输出

    但您希望所有未来的数据类型都使用这种方法,我认为哥德尔定理的一个变体适用于此:即使YAML库被扩展以覆盖所有已知情况并以可读的方式转储它们,也总会有新的数据结构,特别是在基于C的扩展中(如Numpy),如果没有额外的工作,就无法以可读的方式表示

    因为你的

    我还没有想到的任何其他未来未知数据类型


    前提是,这不仅仅是一项艰巨的工作,而且是不可能的。

    你确定严格的不可能吗?最后,任何数据结构都将由其他数据结构组成,递归地,最终将是一些原语。我假设某个库以某种树格式实现了这一点,但为什么这是不可能的呢?还有,如果没有“任何未来”的需求呢?是否有一些库在内部处理其他用例?ruamel.yaml和PyYAML中都没有(我认为NumPy不能与syck库一起工作)。原则上,第三方库可以提供更好的可读性表示,但我认为任何库都不能。我曾经考虑过为ruamel.yaml这样做,但我必须深入研究,而且我不是NumPy用户,所以这样做的动机很低。。您应该能够monkeypatch您正在使用的那些NumPy类。如果您需要这方面的帮助(对于
    ruamel.yaml
    ),请发布另一个关于转储的完整程序的问题,输出是什么样子的,以及您想要什么输出