2016-11-04 3 views
1

I는 다음과 같습니다 파이썬과 YAML 파일 정렬하려에서 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 
........ 
........ 
........ 

파일이 매우 긴입니다.

import yaml 

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

: 파일을 읽는 동안 그것을 할 수있는 방법이 있나요

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

: CIDR 표기법에 따라 블록을 넣어 파이썬으로 파일을 읽어 달성 할 수 있지만, 나는 밖으로 정렬 싶습니다 또는 파일을 한 줄씩 읽어야합니까? 고마워.

+0

'yaml.load (stream)'을 호출하면 (이 경우) 파이썬 사전이 생깁니다. 실제로는 더 이상 YAML 질문이 아닙니다. 당신은 정말로 "사전에있는 항목을 키에 따라 정렬하여 인쇄 할 수 있습니까?"라고 묻는 것입니다. 많은 리소스가 있습니다. [netaddr] (https://pypi.python.org/pypi/netaddr) 모듈은 CIDR 구문 분석에 도움이 될 수 있습니다. – 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) 

덕분에 많이.

관련 문제