2017-06-20 27 views
1

當我定義一個函數,並嘗試在其中使用os.walk時,輸出只是目錄中的第一個文件,我想打印出C驅動器中的所有文件。Python定義函數輸出只有第一個目錄

#os.chdir=("..") 
def dirslist(): 
for root, dirs, files in os.walk("c://", topdown=False): 
    for name in files: 
    return(os.path.join(root, name)) 
    for name in dirs: 
    return(os.path.join(root, name)) 

print(dirslist()) 
+2

只能「返回」一次,之後該功能結束。 – jonrsharpe

+0

嘗試所有for循環後返回數組? – jmunsch

回答

2

return在第一次迭代本身中返回。你想要的是從所有迭代中獲取路徑。一種方法是將return更改爲yield。現在dirslist成爲一個生成器函數,並逐一產生你的路徑。

def dirslist(): 
    for root, dirs, files in os.walk("c://", topdown=False): 
     for name in files: 
      yield(os.path.join(root, name)) 
     for name in dirs: 
      yield(os.path.join(root, name)) 


print(list(dirslist())) 

的另一種方法,如果你不是一個人的發電機,是積累你的路在列表中,並返回來代替。

def dirslist(): 
    paths = [] 
    for root, dirs, files in os.walk("c://", topdown=False): 
     for name in files: 
      paths.append(os.path.join(root, name)) 
     for name in dirs: 
      paths.append(os.path.join(root, name)) 

    return paths 

print(dirslist()) 

這裏要注意的主要問題是從函數return回報只有一次,而yield回報在每次迭代,從每個被調用時前一次迭代後立即恢復。

+0

這可能是一個noob問題,但我如何在新行(\ n)上輸出每個文件? –

+0

@ShantanuGhare:沒關係。你可以做'l = list(dirslist()); for x in l:print(x)'。使用for循環並遍歷列表。 –

+0

非常感謝!這真的幫助了我! –

0

使用返回語句自動結束函數。如果你打算使用return,那麼知道你的代碼在那裏結束。如果你想全部打印,然後連接所有的字符串,然後在一個返回結束時完成。

4
def dirslist(): 

answer = [] 
for root, dirs, files in os.walk("c://", topdown=False): 
    for name in files: 
    answer.append(os.path.join(root, name)) 

    for name in dirs: 
    answer.append(os.path.join(root, name)) 

return answer 

print(dirslist()) 
1

如果您想打印出C盤中的所有內容。 使用打印代替返回