2010-02-18 47 views
0

我有一個包含文件「DIR.TXT」與下面的數據文件:內容的文件,以樹的形式使用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 

我想分析該文件,並得到像

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

使用python,基本上需要以樹形格式打印內容。我將如何處理它?

+0

你的編輯完全改變了原來的問題!如果您需要擴展已經發布的解決方案,您需要縮小問題範圍併發布另一個問題! – SilentGhost 2010-02-18 13:18:21

+0

wtf? Panther24,我們寄給你一個銀盤的codez,你進來,讓所有看起來像不知道/理解Python的基本知識的傻瓜! – SilentGhost 2010-02-18 13:29:32

+0

@SilentGhost,對不起,我只是一個學習新東西的新手。不要打擾看看我發佈的內容,我應該可以處理它。乾杯!! – Vivek 2010-02-18 17:46:36

回答

4

您需要在每個路徑上使用os.path.split,請按照原樣查找第一個dirname和打印路徑。找到它的長度並在下一個基本名稱之前打印如此多的空格,然後像以前一樣改變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 
+0

+1不要忘記呼吸:) – 2010-02-18 12:45:31

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

測試,測試,測試:) – SilentGhost 2010-02-18 13:04:19

+0

這不會工作是行不排序。 – ghostdog74 2010-02-18 13:22:47

+0

@ ghostdog74:在答案中沒有任何跡象表明它可能是這種情況,即使是這樣,爲''子句添加'sorted'也是微不足道的。 – SilentGhost 2010-02-18 13:25:32

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

@運算,使用字典。使用路徑,密鑰和文件名作爲值

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

執行格式化由其他人張貼的答案中描述。

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評論他們根本不需要它,我會刪除這個答案。