2016-11-04 2 views
1

Ich versuche, eine YAML-Datei mit Python zu sortieren, die wie folgt aussieht:lesen und sortieren Zeilenblock von YAML-Datei in Python

........ 
........ 
........ 
# 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 
........ 
........ 
........ 

die Datei sehr lang ist. Ich konnte erreichen, um die Datei mit Python zu lesen, aber ich möchte die aus Blöcke setzen je nach CIDR Notation sortieren:

........ 
........ 
........ 
# 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 
........ 
........ 
........ 

Gibt es eine Möglichkeit, es zu tun, während die Datei zu lesen:

import yaml 

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

oder soll ich die Datei Zeile für Zeile lesen? Danke vielmals.

+0

Sobald Sie 'yaml.load (stream)' aufrufen, haben Sie (in diesem Fall) ein Python-Wörterbuch, an diesem Punkt ist es nicht mehr wirklich eine YAML-Frage. Sie fragen wirklich nur: "Wie drucke ich die Elemente in einem Wörterbuch, sortiert nach ihrem Schlüssel?", Für die es viele Ressourcen gibt. Das Modul [netaddr] (https://pypi.python.org/pypi/netaddr) kann eine Hilfe beim Parsen von CIDR ntoation sein. – larsks

+0

@larks, danke Mann, ich werde einen Blick darauf werfen. – Max

Antwort

0

hatte ich einige Zeit, daran zu arbeiten, und ich kam mit folgenden Lösung:

#!/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) 

Vielen Dank.