Я пытаюсь разобрать вывод из инструмента в структуру данных, но у меня возникают трудности с правильной настройкой. Файл выглядит следующим образом:
Fruits
Apple
Auxiliary
Core
Extras
Banana
Something
Coconut
Vegetables
Eggplant
Rutabaga
Вы можете видеть, что элементы верхнего уровня имеют отступы одним пространством, а элементы под ним имеют отступы на два пробела для каждого уровня. Элементы также находятся в алфавитном порядке.
Как превратить файл в список Python, что-то вроде ["Fruits", "Fruits/Apple", "Fruits/Banana", ..., "Vegetables", "Vegetables/Eggplant", "Vegetables/Rutabaga"]
?
>>> 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']
чтобы вы не хотели, чтобы самый глубокий уровень был правильным? Я не знаю, правильно ли я прав, но, тем не менее, здесь один подход
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']
Предполагается, что ваш входной файл является "datafile.txt", вы используете только пробелы с отступом, вы указываете свой indent_string на уровень, а ваш уровень 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
Вы можете сделать что-то вроде этого:
builder, outlist = [], []
current_spacing = 0
with open('input.txt') as f:
for line in f:
stripped = line.lstrip()
num_spaces = len(line) - len(stripped)
if num_spaces == current_spacing:
builder.pop()
elif num_spaces < current_spacing:
for i in xrange(current_spacing - num_spaces):
builder.pop()
builder.append(stripped)
current_spacing = num_spaces
outlist.append("/".join(builder))
print outlist