2010-02-18 5 views
0

J'ai un fichier contenant un fichier « dir.txt » avec les données ci-dessous:Contenu du fichier au format d'arbre en utilisant python

/home/abc/a.txt 
/home/abc/b.txt 
/home/xyz/test 
/home/xyz/test/d.txt 
/home/xyz/test/e.txt 
/home/xyz/test/f.txt 
/home/xyz 
/home/xyz/g.txt 

Je veux analyser le fichier et obtenir la sortie comme

/home/abc/a.txt 
      b.txt 
/home/xyz/test/d.txt 
       e.txt 
       f.txt 
/home/xyz/g.txt 

En utilisant python, vous devez essentiellement imprimer le contenu dans un format arborescente. Comment pourrais-je le traiter?

+0

votre modification modifie complètement la question d'origine! Si vous avez besoin d'étendre les solutions déjà affichées, vous devez affiner votre problème et poster une autre question! – SilentGhost

+0

wtf? Panther24, nous t'envoyons du codez d'une assiette en argent et tu rentres et fait tout ressembler à des idiots qui ne connaissent pas les bases de Python! – SilentGhost

+0

@SilentGhost, désolé, mais je suis juste un nouvel enfant sur le bloc d'apprentissage de nouvelles choses. Ne vous embêtez pas à regarder ce que j'ai posté, je devrais être capable de le gérer. À votre santé!! – Vivek

Répondre

4

vous devez utiliser os.path.split sur chaque chemin, trouver le premier nom de répertoire et le chemin d'impression tel qu'il est. trouvez la longueur et imprimez autant d'espaces avant la prochaine basename, au changement du dirname répétez comme avant.

>>> import os.path  
>>> olddir = None 
>>> for name in open('input.txt'): 
    dirname, fname = os.path.split(name) 
    if olddir != dirname: 
     prefix = ' ' * (len(dirname) +1) 
     olddir = dirname 
     print(name) 
    else: 
     print(prefix + fname) 


/home/abc/a.txt 
      b.txt 
/home/xyz/test/d.txt 
       e.txt 
       f.txt 
/home/xyz/g.txt 
+0

+1 ne pas oublier de respirer :) –

2

Essayez ceci:

import os.path 

txt = """/home/abc/a.txt 
/home/abc/b.txt 
/home/xyz/test/d.txt 
/home/xyz/test/e.txt 
/home/xyz/test/f.txt 
/home/xyz/g.txt""" 

last_d = '' 
for l in txt.split('\n'): 
    (d, n) = os.path.split(l) 
    if d == last_d: 
     d = ' ' * len(last_d) 
    else: 
     last_d = d 
    print('%s/%s' % (d, n)) 
+0

tests, tests, tests :) – SilentGhost

+0

cela ne fonctionnera pas est les lignes ne sont pas triées. – ghostdog74

+0

@ ghostdog74: il n'y avait aucune indication dans la réponse que cela puisse être le cas, même si c'est le cas, l'ajout d'une clause 'sorted' à' for' est trivial. – SilentGhost

0
>>> filenames="""/home/abc/a.txt 
... /home/abc/b.txt 
... /home/xyz/test/d.txt 
... /home/xyz/test/e.txt 
... /home/xyz/test/f.txt 
... /home/xyz/g.txt""".split() 
>>> 
>>> import os 
>>> prev='' 
>>> for n in filenames: 
...  path,name = os.path.split(n)  
...  if path==prev: 
...   print " "*len(prev)+" "+name 
...  else: 
...   print n 
...   prev=path 
... 
/home/abc/a.txt 
      b.txt 
/home/xyz/test/d.txt 
       e.txt 
       f.txt 
/home/xyz/g.txt 
2

@ Op, utilisez un dictionnaire. Utilisez les chemins que la clé et les noms de fichiers en tant que valeurs

from collections import defaultdict 
d=defaultdict(list) 
for line in open("file"): 
    line=line.strip() 
    s='/'.join(line.split("/")[:-1]) 
    d[s].append(line.split("/")[-1]) 

for i,j in d.iteritems(): 
    print i,j 

sortie

$ ./python.py 
/home/xyz ['g.txt'] 
/home/xyz/test ['d.txt', 'e.txt', 'f.txt'] 
/home/abc ['a.txt', 'b.txt'] 

le formatage comme décrit par les réponses d'autres avaient affiché.

0

Ceci est une prise alternative qui offre une autre sortie, juste au cas où l'OP préférerait ce format:

/home/abc/a.txt 
      b.txt 
     xyz/test/d.txt 
       e.txt 
       f.txt 
      g.txt 

alors ce code:

import os 

def pretty_printer(seq_of_strings): 
    previous_line= '' 
    for line in seq_of_strings: 
     last_sep= os.path.commonprefix([previous_line, line]).rfind(os.path.sep)+1 
     yield ' '*last_sep + line[last_sep:] 
     previous_line= line 

pourrait faire l'affaire.

Si l'OP indique qu'il n'en a pas besoin du tout, je vais supprimer cette réponse.

Questions connexes