Содержимое файла в древовидном формате с использованием Python - PullRequest
0 голосов
/ 18 февраля 2010

У меня есть файл, содержащий файл "dir.txt" со следующими данными:

/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

Я хочу проанализировать файл и получить вывод, подобный

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

Использованиеpython, в основном нужно печатать содержимое в древовидном формате.Как бы я это обработал?

Ответы [ 5 ]

4 голосов
/ 18 февраля 2010

вам нужно использовать os.path.split на каждом пути, найти первое имя каталога и распечатать путь как есть. найдите его длину и напечатайте столько пробелов перед следующим базовым именем, при изменении имени каталога повторите, как и раньше.

>>> 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
2 голосов
/ 18 февраля 2010

@ Op, используйте словарь. Используйте пути в качестве ключа и имена файлов в качестве значений

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

выход

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

Выполните форматирование, как описано в ответах других пользователей.

2 голосов
/ 18 февраля 2010

Попробуйте это:

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 голосов
/ 19 февраля 2010

Это альтернативный вариант, который предлагает другой вывод, на случай, если OP предпочтет этот формат:

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

, тогда этот код:

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

может сработать.

Если ОП прокомментирует, что им это вообще не нужно, я удалю этот ответ.

0 голосов
/ 18 февраля 2010
>>> 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...