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

时间:2018-12-31 12:33:49

标签: python file serialization yaml pickle

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

a。 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)

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

是否可以同时满足这两个要求?

1 个答案:

答案 0 :(得分:2)

不,您的要求无法满足。

您已经具有保存所有这些数据类型的功能yaml.dump()。如您所见,对于numpy数据结构,它不是以一种非常易读的方式进行的。这是由于numpy没有针对其特殊数据结构的转储例程,而是回退到了该数据结构的,不太可读的默认!python....标记转储。现在,您(或YAML或Numpy程序包维护者)可以为那些以更易读的格式进行转储的对象提供特殊的例程,以便可以解决。您可以使更智能,并在不触及Numpy类的情况下获得Numpy数据结构的可读性更高的输出。

但是您希望所有将来的数据类型都使用此方法,IMO则采用了Gödel定理的一种变体:即使扩展了YAML库,使其涵盖了所有已知的情况并以可读的方式将其转储,总会有新的数据结构,特别是在基于C的扩展(例如Numpy)中,如果不进行额外的工作就无法以可读的方式表示。

所以因为你

  

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

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