如何在Python中解析基于选项卡的文本文件?
如何解析此文本文件:如何在Python中解析基于选项卡的文本文件?,python,Python,如何解析此文本文件: mapping apple v1: v1a : v1b mapping ball v2: v2a : v2b 得到 {'apple':['v1'、'v1a'、'v1b']、'ball':['v2'、'v2a'、'v2b']} 在一个映射下可以有多个V,如: 映射苹果 v1:v1a:v1b v2:v2a:v2b v3:v3a:v3b 映射球 v1:v1a:v1b v2:v2a:v2b 这就是我迄今为止所尝试的: copy=False for line in
mapping apple
v1: v1a : v1b
mapping ball
v2: v2a : v2b
得到
{'apple':['v1'、'v1a'、'v1b']、'ball':['v2'、'v2a'、'v2b']}
在一个映射下可以有多个V,如:
映射苹果
v1:v1a:v1b
v2:v2a:v2b
v3:v3a:v3b
映射球
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
您可以使用,这并不意味着需要确定开始和结束。您只需标识“映射”行和所有其他包含值的行:
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']})
defaultdict(,{'apple':['v1','v1a','v1b'],'ball':['v2','v2a','v2b']})
您可以使用和函数的组合来避免不必要的检查:
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)
重新导入
输入数据=“”
苹果地图
v1:v1a:v1b
映射球
v2:v2a:v2b
'''
#将输入转换为列表
input_data=input_data.strip().split('\n')
#创建迭代器
迭代=iter(输入数据)
#声明输出字典
输出={}
#开始迭代
对于迭代_中的行:
match=re.findall(r'(?我正在尝试这种类型的东西,但每次我都需要一个映射开始和映射结束。copy=False用于fh中的行:if line.strip()=“mapping\u start”:copy=True elif line.strip()=“mapping\u end”:copy=False elif copy:#在此处制作一本词典
这些“alias\u start”
和“alias\u end”在哪里
您正在文本文件中查找的内容?@SunalMittal请将代码添加到您的问题中,而不是添加到注释中,因为它属于实际问题。注释不应包含重要信息。@尽管他编辑了注释。如果您这样做会更好Sunal。。为什么映射\u开始
而不是映射开始
?您的代码似乎与示例数据不符。这仅适用于line.split(“:”)
只有一组值的情况,但第一个答案使用defaultdict(列表)提供了apple或ball下多组值的解决方案这将适用于任意数量的值映射苹果v1:v1a:v1b v3:v3a:v3b映射球v2:v2a:v2b
我的解决方案与第一个答案几乎相同,只是略有不同。在这种情况下,v1和v3在单独的行中,所以值不会被v3覆盖吗?
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)