2017-07-17 80 views
-2

如何解析這個文本文件:如何根據Python中的選項卡解析文本文件?

mapping apple 
    v1: v1a : v1b 
mapping ball 
    v2: v2a : v2b 

得到

{'apple':['v1','v1a','v1b'], 'ball':['v2','v2a','v2b']}

可以有多個五世下像一個單一的映射:

mapping apple

v1: v1a : v1b

v2: v2a : v2b

v3: v3a : v3b

mapping ball

v1: v1a : v1b

v2: v2a : v2b

這是我到目前爲止已經試過:

copy=False 
for line in fh: 
    if line.strip()=="mapping_start": 
     copy=True 
    elif line.strip()=="mapping_end": 
     copy=False 
    elif copy: 
     if line.find('#')==-1 and len(line.strip())>0: 
      #make a dictionary here 
+0

我正在嘗試這樣的東西,但我每次都需要一個mapping_start和mapping_end。 '副本=假 在FH行: 如果line.strip()== 「mapping_start」: 複製=真 ELIF line.strip()== 「mapping_end」: 副本=假 ELIF複製: #在這裏做一個字典' –

+0

你在文本文件中查找的這些「alias_start」和「alias_end」在哪裏? –

+0

@SunalMittal請將代碼添加到您的問題中,而不是發表評論,因爲它屬於實際問題。評論不應包含重要信息。 – Evert

回答

1

您可以使用defaultdict,這並不需要識別開始和結束。你只需要確定的「映射」線和所有其他行持有的價值觀:

from collections import defaultdict 

fH = """mapping apple 
    v1: v1a : v1b 
mapping ball 
    v2: v2a : v2b""" 

result = defaultdict(list) 
for line in fH.splitlines(): 
    if 'mapping' in line: 
    key = line.split()[1] 
    else: 
    for values in line.split(':'): 
     result[key].append(values.strip()) 

print(result) 

返回:

defaultdict(<class 'list'>, {'apple': ['v1', 'v1a', 'v1b'], 'ball': ['v2', 'v2a', 'v2b']}) 
1
with open("lol.txt", 'r') as config: 
    adict = {} 
    for line in config.readlines(): 
     if 'mapping' in line: 
      key = line.strip().split()[-1] 
     else: 
      line = line.replace(' ', '').strip() 
      adict[key] = line.split(':') 
+0

這隻適用於'line.split(':')'只有一組值的情況,但第一個答案通過使用defaultdict(list)和追加功能。 –

+0

這將與任意數量的值 – Alexey

+0

的工作'映射蘋果 V1:V1A:V1B V3:V3A:V3B 測繪球 V2:V2A:v2b' –

1

您可以使用reiter()組合next()功能逃跑不必要支票:

import re 

input_data = ''' 
mapping apple 
     v1: v1a : v1b 
mapping ball 
     v2: v2a : v2b 
''' 

# convert input to list 
input_data = input_data.strip().split('\n') 
# create iterator 
iterate_over = iter(input_data) 
# declare output dictionary 
output = {} 

# start iteration 
for line in iterate_over: 
    match = re.findall(r'(?<=^mapping\s)\w+$', line) 
    if match: 
     try: 
      output.update({match[0]: re.sub(r'\s+', '', next(iterate_over)).split(':')}) 
     except StopIteration: 
      break 

print(output)