2011-06-22 6 views
2

J'ai un fichier comme divisé en sections comme ça:remplacer les noms des listes de fichiers

[main] 

a 
b 
< sectionA 
c 

[sectionA] 
x 
< sectionB 
y 
z 

[sectionB] 
q 
w 
e 

Je veux remplacer le « < SectionA » avec le contenu de SectionA et ainsi de suite. Le résultat final devrait être une liste avec seulement les éléments dans le bon ordre, comme ceci: ['a', 'b', 'x', 'q', 'w', 'e', ​​'y', ' z ',' c ']

A fait le code ci-dessous qui remplit le fichier dans un dictionnaire avec des listes, mais l'ordre n'est pas celui que j'ai utilisé dans l'insertion (donc je ne peux pas être sûr d'où je commence).

Je ne savent pas la meilleure façon de remplacer les choses « < SectionA » avec le contenu de la liste réelle ...

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) 

et le résultat est: { « principale »: [ 'a', 'b', '< sectionA', 'c'], 'sectionB': ['q', 'w', 'e'], 'sectionA': ['x', '< section B', 'y', 'z']}

Répondre

0

J'ai fait un code fou pour vous:

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) 

que la fonction join insère le code dans la liste de droite, il ne faudra pas calculer les listes plus d'une fois si nécessaire en deux endroits ou plus. :)

En utilisant OrderedDict, vous commencez toujours par la bonne liste.

+0

J'ai aimé votre fonction de jointure. Je vais l'utiliser avec mon code (avec quelques changements) pour charger le fichier parce que je n'ai pas compris le vôtre ... –

0

Ce n'est pas si difficile. C'est l'algorithme:

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. 
0

J'ai résolu votre problème avec deux fonctions. Le premier pour rendre le fichier d'entrée (renderfile(filename)) dans un dictionnaire Python, et la seconde pour fusionner le contenu avec la section des références avec une section de départ (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

On dirait qu'il manque quelque chose, où 'files' est-il défini? –

+0

Je suis désolé. Eu quelques problèmes avec le code. Je l'ai corrigé! – Pit

+2

Je pense que OP a déclaré que les sections sont dans un seul fichier. Vous ouvrez les fichiers avec le nom de la section – JBernardo

Questions connexes