在python中读取和排序yaml文件的行块

时间:2016-11-04 14:05:59

标签: python sorting yaml readfile

我正在尝试使用python对yaml文件进行排序,如下所示:

........
........
........
# comment
ip address/20:
  datacenter: x
  context: y
# comment
ip address/32:
  datacenter: a
  context: b
# comment
ip address/24:
  datacenter: x
  context: z
# comment
ip address/16:
  datacenter: a
  context: b
........
........
........

文件很长。我可以用python读取文件,但是我想根据CIDR表示法对输出块进行排序:

........
........
........
# comment
ip address/16:
  datacenter: a
  context: b
# comment
ip address/20:
  datacenter: x
  context: y
# comment
ip address/24:
  datacenter: x
  context: z
# comment
ip address/32:
  datacenter: a
  context: b
........
........
........

在阅读文件时有没有办法做到这一点:

import yaml

with open("file.yml", 'r') as stream:
    try:
        print(yaml.load(stream))
    except yaml.YAMLError as err:
        print(err)

或者我应该逐行阅读文件?非常感谢。

1 个答案:

答案 0 :(得分:2)

我有时间研究它,我想出了以下解决方案:

#!/usr/bin/env python3

 import yaml
 #from functools import reduce

with open("sprd_variator.yml", 'r') as input_file:
    try:
        dict = yaml.load(input_file)
        i = 'networks'
        if i in dict:
            sorted_sub = sorted(dict[i].items())
            sorted_sub_keys = sorted(dict[i].keys())
            sorted_sub_keys.sort(key = lambda x: int(x.rsplit('/',2)[1]))
            networks = []
            for x in sorted_sub_keys:
                facters = [item for item in sorted_sub if item[0] == x]
                networks.append(facters)
                one_list = [item for sublist in networks for item in sublist]
                #one_list = reduce(lambda x,y: x+y,networks)
            print(one_list)
        else:
            print('error')
    except yaml.YAMLError as err:
        print(err)

非常感谢。