Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中解析基于选项卡的文本文件?_Python - Fatal编程技术网

如何在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)