在Python中解析层次结构文件
我正在尝试把一个工具的输出结果解析成一个数据结构,但在这个过程中遇到了一些困难。这个文件的内容看起来是这样的:
Fruits
Apple
Auxiliary
Core
Extras
Banana
Something
Coconut
Vegetables
Eggplant
Rutabaga
你可以看到,最顶层的项目缩进了一个空格,而下面的项目每增加一级就缩进两个空格。所有的项目也都是按字母顺序排列的。
我该如何把这个文件转换成一个Python列表,类似于 ["Fruits", "Fruits/Apple", "Fruits/Banana", ..., "Vegetables", "Vegetables/Eggplant", "Vegetables/Rutabaga"]
这样的格式呢?
4 个回答
0
这里假设你的输入文件叫做 'datafile.txt',而且你只用空格来进行缩进。你需要为每个层级指定一个缩进字符串,并且第0层级是没有任何缩进的(最底层完全没有空格)。不过,这些限制都可以很容易地去掉。基本的布局应该是很清楚的:
import re
indent_string = ' '
pattern = re.compile('(?P<blanks>\s*)(?P<name>.*)')
f = open('datafile.txt')
cache={}
for line in f:
m = pattern.match(line)
d = m.groupdict()
level = len(d['blanks']) / len(indent_string)
cache.update({level: d['name']})
s = ''
for i in xrange(level+1):
s += '/' + cache[i]
print s
1
所以你是说你不想要最深的层级,对吧?我不确定我是否理解正确,不过无论如何,这里有一种方法。
d=[]
for line in open("file"):
if not line.startswith(" "):
if line.startswith(" "):
d.append(p+"/"+line.strip())
elif line.startswith(" "):
p=line.rstrip()
输出结果
$ ./python.py
[' Fruits/Apple', ' Fruits/Banana', ' Fruits/Coconut', ' Vegetables/Eggplant', ' Vegetables/Rutabaga']
4
在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,不知道该怎么解决。比如,有人可能在使用某个特定的功能时,发现它没有按照预期工作,或者出现了错误信息。这种情况很常见,尤其是对于刚开始学习编程的小伙伴们。
通常,解决这些问题的方法是仔细检查代码,看看有没有拼写错误、遗漏的部分或者不正确的用法。同时,也可以查阅相关的文档或教程,了解这个功能的正确使用方式。如果还是解决不了,可以向社区求助,比如在StackOverflow上提问,描述清楚自己的问题,附上相关的代码和错误信息,这样其他人就能更好地帮助你。
总之,遇到问题时不要慌张,慢慢分析,寻找解决方案,编程的过程就是不断学习和解决问题的过程。
>>> with open("food.txt") as f:
... res = []
... s=[]
... for line in f:
... line=line.rstrip()
... x=len(line)
... line=line.lstrip()
... indent = x-len(line)
... s=s[:indent/2]+[line]
... res.append("/".join(s))
... print res
...
['Fruits', 'Fruits/Apple', 'Fruits/Apple/Auxiliary', 'Fruits/Apple/Core', 'Fruits/Apple/Extras', 'Fruits/Banana', 'Fruits/Banana/Something', 'Fruits/Coconut', 'Vegetables', 'Vegetables/Eggplant', 'Vegetables/Rutabaga']