我有一个包含文件“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,基本上需要以树格式打印内容。我该如何处理?
答案 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评论他们根本不需要它,我会删除这个答案。