在Python中解析层次结构文件

1 投票
4 回答
2587 浏览
提问于 2025-04-15 21:05

我正在尝试把一个工具的输出结果解析成一个数据结构,但在这个过程中遇到了一些困难。这个文件的内容看起来是这样的:

 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']

撰写回答