使用python将文件内容转换为树格式

时间:2010-02-18 12:32:30

标签: python treeview

我有一个包含文件“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 个答案:

答案 0 :(得分:4)

你需要在每条路径上使用os.path.split,找到第一个dirname和打印路径。找到它的长度并在下一个basename之前打印这么多空格,改变dirname就像以前一样重复。

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

答案 1 :(得分:2)

试试这个:

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))

答案 2 :(得分:2)

@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']

按其他人发布的答案所述进行格式化。

答案 3 :(得分: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

答案 4 :(得分:0)

这是另一种提供不同输出的视图,以防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

可能会成功。

如果OP评论他们根本不需要它,我会删除这个答案。