我正在尝试在Python中导入类似于下面报告的文本文件。
+ CATEGORY_1 first_part of long attribute <NAME_a>
| ...second part of long attribute
| + CATEGORY_2: a sequence of attributes that extend over
| | ... possibly many <NAME_b>
| | ... lines
| | + SOURCE_1 => source_code
| + CATEGORY_2: another sequence of attributes that extend over <NAME_c>
| | ... possibly many lines
| | + CATEGORY_1: yet another sequence of <NAME_d> attributes that extend over
| | | ...many lines
| | | + CATEGORY_2: I really think <NAME_e> that
| | | | ... you got the point
| | | | ... now
| | | | + SOURCE_1 => source_code
| + SOURCE_2 => path_to_file
假设我可以轻松识别由&lt; ...&gt;
分隔的对象名称我的理想输出是Python字典,它反映了txt文件的层次结构,例如:
{NAME_a : {'category' : CATEGORY_1,
'depencencies' : {NAME_b : {'category' : CATEGORY_2,
'source_type' : SOURCE_1,
'source_code' : source_code}
NAME_c : {'category' : CATEGORY_2,
'dependencies' : { NAME_d : {'category' : CATEGORY_1,
'dependencies' : NAME_e : {'category' : CATEGORY_2,
'source_type' : SOURCE_1,
'source_code' : source_code}
}
}
'source_type' : SOURCE_2,
'source_code : path_to_file
}
}
认为这里的主要思想是在行开始之前计算制表符的数量,这将决定层次结构。 我试着看看pandas read_fwf和numpy loadfromtxt,但没有任何成功。 你能指点我解决这个问题的相关模块或策略吗?
答案 0 :(得分:0)
不是一个完整的答案,但你可以使用堆栈的方法。
每次输入类别时,都会将类别键推送到堆栈。 然后你读取该行,检查标签的数量并存储。如果级别与先前级别相同或更高,则从堆栈中弹出项目。 然后你只需要基本的正则表达式来提取项目。
一些Python /伪代码,所以你可以有一个想法
levels = []
items = {}
last_level = 0
for line in file:
current_level = count_tabs()
if current_level > last_level:
name = extract_name(line)
levels.append(name)
items = fill_dictionary_in_level(name, line)
else:
levels.pop()
last_level = current_level
return items
答案 1 :(得分:0)
这是一个策略:
对于每一行,使用RegEx来解析该行并提取数据。
这是草稿:
import re
line = "| + CATEGORY_2: another sequence of attributes that extend over <NAME_c>"
level = line.count("|") + 1
mo = re.match(r".*\+\s+(?P<category>[^:]+):.*<(?P<name>[^>]+)>", line)
category = mo.group("category")
name = mo.group("name")
print("level: {0}".format(level))
print("category: {0}".format(category))
print("name: {0}".format(name))
你得到:
level: 2
category: CATEGORY_2
name: NAME_c