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

使用python将文件内容转换为树格式,python,treeview,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

我有一个包含文件“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,基本上需要以树格式打印内容。如何处理它?

您需要在每个路径上使用
os.path.split
,找到第一个目录名并按原样打印路径。找到它的长度并在下一个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
试试这个:

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

@哦,使用字典。使用路径作为键,文件名作为值

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

按照其他人发布的答案进行格式设置。

这是一个提供不同输出的备选方案,以防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评论他们根本不需要它,我将删除此答案。

您的编辑完全改变了原始问题!如果你需要扩展已经发布的解决方案,你需要缩小你的问题范围并发布另一个问题!世界跆拳道联盟?Panther24,我们给你发了一个银盘密码,你进来了,让所有人看起来像是不懂Python基本知识的白痴@抱歉,我只是个新来的孩子,学习新东西。别费心看我贴的东西,我应该能处理的。干杯@ghostdog74:答案中没有任何迹象表明可能是这样,即使是这样,将
排序的
添加到
for
子句是微不足道的。我稍微更改了源代码!!
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