2016-11-04 46 views
1

我試圖理清與Python YAML文件看起來像這種行塊:閱讀和YAML文件在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 
........ 
........ 
........ 

該文件是很長。我可以實現閱讀與蟒蛇的文件,但我想排序出把根據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) 

或者我應該逐行讀取文件?非常感謝。

+0

一旦你調用'yaml.load(stream)'你有(在這種情況下)一個Python字典,在這一點上,它不再是一個YAML問題。你真的只是問,「我怎麼在字典中打印這些項目,按照它們的關鍵字排序?」,對此,有很多資源。 [netaddr](https://pypi.python.org/pypi/netaddr)模塊可能對解析CIDR ntoation有幫助。 – larsks

+0

@larsks,謝謝你,我來看看。 – Max

回答

0

我有一些時間來進行這項工作,我想出了以下解決方案:

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

非常感謝。