2012-09-25 60 views
2

這是我的第一篇文章,所以要溫柔。 ;)Python沃克不會進入特定的文件夾

問題:我想能夠使用os.walk作爲目錄walker,但不能做到某些文件夾。例如:

樹:

\Proj1_0 
    \Load001 
     \lib 
     \src 
\Proj2_0 
    \Load001 
     \lib 
     \src 
    \Load002 
     \lib 
     \src 

我想說明的項目和加載,但不是在外力作用下的子目錄。我可以使用下面的代碼來做到這一點。

import os 


for root, subFolders, files in os.walk('.'): 
    # root does NOT contain 'Load' 
    if root.find('Load') == -1: 
     print "\nPROJECT: " + root + "\n" 
     for folder in subFolders: 
      print " " + folder 

然而,列出的是一個大名單,所以我試圖用DEL鍵,但不能讓它的工作權和使用列表,如(這是我從另一個崗位來到這裏)同樣的事情:

def my_walk(top_dir, ignore): 
    for dirpath, dirnames, filenames in os.walk(top_dir): 
     dirnames[:] = [ 
      dn for dn in dirnames 
      if os.path.join(dirpath, dn) not in ignore] 
     yield dirpath, dirnames, filename 
list my_walk('.','Load') 

但是我無法得到正確的返回工作。我是Python新手,非常感謝任何幫助。謝謝!

+0

歡迎來到StackOverflow!對於初學者來說,它是如何不起作用的?它不會忽略文件夾嗎?你在「忽略」中給出了什麼論點? –

+0

我想函數os.listdir(..)應該滿足你的需求:) – ddzialak

+0

哇...什麼'dirnames [:] = ...'在做?因爲我知道'dirnames [:]'做了一個列表的副本,但假設它不應該在'='的左側 – ddzialak

回答

1

你可以嘗試以下方法:

for x in os.walk('.', topdown=True): 
    dirpath, dirnames, dirfiles = x 
    print(dirpath, dirnames) 
    dirnames[:] = filter(lambda x : not x.startswith('Load'), dirnames) 

help(os.walk),您可以修改names如果topdownTrue,以限制搜索。

2

嘗試:

dirnames[:] = [ 
     dn for dn in dirnames 
     if ignore not in os.path.join(dirpath, dn)] 

你想保持目錄,其中os.path.join(dirpath, dn)不包含字符串ignore


順便說一句,你是對的對轉讓的左側使用dirnames[:]。要修剪os.walk訪問的目錄,您必須修改相同的列表dirnames

dirnames[:] = ...就地修改相同的列表。 dirnames = ...會將名稱dirnames重定向到不同的值。

+0

+1對'dirnames [:] = ...'的解釋 – ddzialak

0

順便說一句,這是我結束了......

import os,string 
path = '.' 
path = os.path.normpath(path) 
res = [] 

for root,dirs,files in os.walk(path, topdown=True): 
    depth = root[len(path) + len(os.path.sep):].count(os.path.sep) 
    if depth == 2: 
     # We're currently two directories in, so all subdirs have depth 3 
     res += [os.path.join(root, d) for d in dirs] 
     dirs[:] = [] # Don't recurse any deeper 
print(res) 

我知道這是一個古老的職位,但認爲我應該對我的回答更新。如果其他人認爲它有用。