【问题标题】:How to write to yaml file in human readable format?如何以人类可读的格式写入 yaml 文件?
【发布时间】:2018-12-31 12:33:48
【问题描述】:

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

一个。 numpy 数组的列表,例如[ndarray, ndarray, ndarray] 大小不一。

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

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

要求:

  1. 我需要一个函数来保存所有这些数据类型,无需特定处理,并且未来与上述 c 类型兼容。

  2. 我还需要人类可读格式的输出文件转储。

到目前为止,我只能使用 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)

此示例代码输出非人类可读的文件,但适用于我拥有的数据类型。

有没有办法同时满足这两个要求?

【问题讨论】:

    标签: python file serialization yaml pickle


    【解决方案1】:

    不,无法满足您的要求。

    您已经有一个函数yaml.dump() 可以保存所有这些数据类型。正如您所注意到的,对于 numpy 数据结构,它并没有以一种非常易读的方式这样做。这是由于 numpy 没有针对其特殊数据结构的转储例程,而是退回到不那么可读的默认 !python.... 标记的数据结构转储。现在您(或 YAML 或 Numpy 包维护者)可以为那些以更易读的格式转储的对象提供特殊的例程,以便可以覆盖。您可以使 YAML 库中的表示器更智能,并为 Numpy 数据结构获得更具可读性的输出,而无需接触 Numpy 类。

    但是您希望对所有未来的数据类型都使用此功能,并且 IMO 应用了哥德尔定理的变体:即使 YAML 库经过扩展以涵盖所有已知情况并以可读方式转储它们,总会有新的数据结构,特别是在基于 C 的扩展(如 Numpy)中,如果没有额外的工作,就无法以可读的方式表示。

    因为你的

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

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

    【讨论】:

    • 你确定严格的不可能吗?最后,任何数据结构都将由其他数据结构组成,递归地,最终将是一些原语。我假设一些库以某种树格式实现了它,但为什么不可能呢?
    • 另外,如果没有“任何未来”的要求怎么办?是否有一些库可以在内部处理其他用例?
    • ruamel.yaml 和 PyYAML 中没有任何内容(我认为 NumPy 不能与 syck 库一起使用)。原则上第三方库可以提供更好的可读性表示,但我认为任何库都没有。我曾经考虑为 ruamel.yaml 这样做,但我不得不深入挖掘,而且我不是 NumPy 用户,所以这样做的动机很低。你应该能够对你正在使用的那些 NumPy 类进行猴子补丁.如果您需要这方面的帮助(对于ruamel.yaml),请发布另一个问题,其中包含转储的完整程序、输出的外观以及您想要的输出
    猜你喜欢
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多