如何在Python中解析基于tab的文本文件?

2024-09-27 21:33:10 发布

您现在位置:Python中文网/ 问答频道 /正文

如何解析此文本文件:

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

得到

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

在一个映射下可以有多个V,如:

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

Tags: falseappleiflinemappingv2v1strip
3条回答

可以使用^{}以及^{}^{}函数的组合来避免不必要的检查:

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)
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(':')

您可以使用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']})

相关问题 更多 >

    热门问题