2011-06-08 102 views
1

我可以做這樣的事情(其實它不工作)得到全路徑名

flist = [dirpath + f for f for fnames for dirpath, dirnames, fnames in os.walk('/home/user')] 

的感謝!

+1

雙榜內涵是難以閱讀和理解。改用循環,你的問題就會消失。 – 2011-06-08 13:46:49

回答

2

fnames尚不存在。交換循環。

flist = [dirpath + f for dirpath, dirnames, fnames in os.walk('/home/user') for f in fnames] 
+0

+1:我*總是*在列表理解中以錯誤的方式獲得多個'for'。現在我完全避免它們。 – Johnsyweb 2011-06-08 12:14:04

+0

@Johnsyweb:完全避免它們絕對是這裏的正確解決方案。 – 2011-06-08 13:46:08

1
flist = [os.path.join(pdir,f) for pdir, dirs, files in os.walk('/home/user') for f in files] 

os.path.join應該被用來代替字符串連接來處理特定OS的隔膜和特性)

然而,正如一些已經指出的那樣,多級列表理解不是很可讀並容易出錯。

假設你真的想在列表中的結果:如果你只是使用flist作爲中間存儲來遍歷

flist = [] 
for root, dirs, files in os.walk(root_dir): 
    flist.extend(os.path.join(root, f) for f in files) 
    # to support python <2.4, use flist.extend([...]) 

,使用生成如圖你可能會更好John's answer

0

使用地圖:

map(lambda data: map(lambda file: data[0] + '\\' + file, data[2]), os.walk('/home/user')) 

OR:

map(lambda data: map(lambda file: os.path.join(data[0], file), data[2]), os.walk('/home/user')) 
+1

'data [0] +'\\'+ file'而不是'os.path.join'是一個非常糟糕的主意。 – 2011-06-08 12:26:02

+0

當然,你對它只是一個想法,如何在這裏使用map,並且字符串附加可以很容易地用os.path.join替換。 – 2011-06-08 12:27:30

3

個人而言,我會寫作爲發電機:

def filetree(top): 
    for dirpath, dirnames, fnames in os.walk(top): 
     for fname in fnames: 
      yield os.path.join(dirpath, fname) 

那麼您可以使用它在一個循環:

for name in filetree('/home/user'): 
    do_something_with(name) 

或啜食入列表:

flist = list(filetree('/home/user')) 
0
path = '/home/user/' # keep trailing '/' 
flist = [path+name for name in os.listdir(path)]