如何从大型yaml文件中获取部分数据?

时间:2018-04-08 23:03:07

标签: yaml

我有一个包含一些无用数据的大型yaml文件。使用yaml.load()加载此文件时,内存消耗超出了我们计算机的物理限制。我看不懂。我是否只能读取python dict所需的部分数据?是否有一些库或代码来解决这个问题?

2 个答案:

答案 0 :(得分:0)

使用PyYaml,您可以执行以下操作:

with open("file.yaml", 'r') as handle:
  for event in yaml.parse(handle):
    # handle the event here

它按事件处理YAML文件事件,而不是将其全部加载到数据结构中。当然,您现在需要从事件流中手动解析结构,但这允许您进一步处理部分数据。

您可以查看PyYaml的Composer implementation,了解它如何从事件构造Python对象,以及它对事件流的期望结构。

答案 1 :(得分:0)

当您控制YAML输出的格式时,这是另一种有用的技术。您可以使用“ ---”分隔符将数据拆分为单独的YAML文档,而不是将数据作为单个结构。例如,代替

    Class1 trans = new Class1();

    MWArray[] input = new MWArray[] { r_h, l_h, r_l, l_l, l_0, r_0, r, u_hv, f1 };

    MWArray[] output = new MWArray[6];


    trans.Transformator(6, ref output, input);

    MWNumericArray Abs_U_lv = output[0] as MWNumericArray;
    //MWNumericArray Ang_U_lv = output[1] as MWNumericArray;
    MWNumericArray Abs_I_hv = output[2] as MWNumericArray;
    //MWNumericArray Ang_I_hv = output[3] as MWNumericArray;
    MWNumericArray Abs_I_lv = output[4] as MWNumericArray;
    //MWNumericArray Ang_I_lv = output[5] as MWNumericArray;

    //var A= (double[])Abs_U_lv.ToArray();
    //var C = (double[,])Abs_I_hv.ToArray();
    //var E = (double[,])Abs_I_lv.ToArray();
    /*double[,] A = new double[Fre.Count,1 ];
    double[,] C = new double[1, Fre.Count];
    double[,] E = new double[1, Fre.Count];*/

    var A = (double[,])Abs_U_lv.ToArray();

    //System.TypeLoadException: ""System.Double[,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,]" der Assembly "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" hat zu viele Dimensionen."

    var C = (double[,])Abs_I_hv.ToArray();
    var E = (double[,])Abs_I_lv.ToArray();

您可以这样写:

- foo: 1
  bar: 2
- foo: 2
  bar: 10

,然后使用以下python代码对其进行解析:

foo: 1
bar: 2
---
foo: 2
bar: 10