заменить имена списками из файла - PullRequest
2 голосов
/ 23 июня 2011

У меня есть файл, подобный разделенному на следующие разделы:

[main]

a
b
< sectionA
c

[sectionA]
x
< sectionB
y
z

[sectionB]
q
w
e

Я хочу заменить «

A сделал приведенный ниже код, который заполняет файл в словаре списками, но порядок не тот, который я использовал при вставке (поэтому я не уверен, с чего начать)

Я также не знаю лучшего способа заменить вещи "

import re
filename = input('Insert filename: ')
f = open(filename)
lines = f.readlines()

elements = {}
name = ''

for i in lines:
    if i[-1] == '\n':
        i = i[:-1]
    if not i:
        continue
    sec = re.findall(r'\[(\w+)\]', i)
    if sec != []:
        name = sec[0]
        elements[name] = []
    else:
        elements[name] += [i]

print(elements)

и результат: {'main': [' a ',' b ','

Ответы [ 3 ]

0 голосов
/ 23 июня 2011

Я решил вашу проблему с двумя функциями. Первый для рендеринга входного файла (renderfile(filename)) в словарь Python, а второй для объединения содержимого со ссылками на разделы с начальным разделом (rendercontents(contents, startsection)):

def renderfile(filename):
    contents = {}
    with open(filename) as f:
        currentsection = ""
        for line in f.readlines():
            if line == "\n":
                continue
            line = line.replace("\n", "")
            if line.startswith("["):
                currentsection = line[1:-1]
                contents[currentsection] = []
            else:
                contents[currentsection].append(line)
    return contents

def rendercontents(contents, startsection):
    returnlist = []
    for line in contents[startsection]:
        if line.startswith("<"):
            returnlist.extend(rendercontents(contents, line[2:]))
        else:
            returnlist.append(line)
    return returnlist

>>> newlist = rendercontents(renderfile("yourfile"), "main")
>>> newlist
['a', 'b', 'x', 'q', 'w', 'e', 'y', 'z', 'c']
0 голосов
/ 23 июня 2011

Я сделал для тебя сумасшедший код:

import collections
def load(fname):
    d = collections.OrderedDict()
    for i in (line.rstrip('\n') for line in open(fname) if line[:-1]):
        d.update({i[1:-1]:[], '_':i[1:-1]}) \
        if i.startswith('[') else d[d['_']].append(i)
    return d

def join(first, dic):
    f = dic[first]
    for i,j in ((i,j[2:]) for i,j in enumerate(f) if j.startswith('<')):
        f[i:i+1] = join(j, dic)
    return f

d = load('file.txt')
join(next(iter(d)), d)

, поскольку функция join вставляет код в правильный список, ей не нужно будет вычислять списки более одного раза, если это требуется в двух или более местах. :)

Используя OrderedDict, вы всегда начинаете с правильного списка.

0 голосов
/ 23 июня 2011

Это не так сложно. Это алгоритм:

1. Find all indexes in main starting with <.
2. If none are found, go to 5.
3. Replace every index with the according section (inserted unpacked).
4. Go to 1.
5. Done.
...