天天看點

python os.walk子產品_Python之os.walk和os.path.walk

一、os.walk()

函數聲明:os.walk(top,topdown=True,οnerrοr=None)

(1)參數top表示需要周遊的頂級目錄的路徑。

(2)參數topdown的預設值是“True”表示首先傳回頂級目錄下的檔案,然後再周遊子目錄中的檔案。當topdown的值為"False"時,表示先周遊子目錄中的檔案,然後再傳回頂級目錄下的檔案。

(3)參數onerror預設值為"None",表示忽略檔案周遊時的錯誤。如果不為空,則提供一個自定義函數提示錯誤資訊後繼續周遊或抛出異常中止周遊。

傳回值:函數傳回一個元組,含有三個元素。這三個元素分别是:每次周遊的路徑名、路徑下子目錄清單、目錄下檔案清單。

os.walk使用執行個體:删除某個檔案夾(當然可以通過os.listdir的遞歸調用删除)

#! /usr/bin/env python

#coding=utf-8

import os

def Remove_dir(top_dir):

if os.path.exists(top_dir)==False:

print "not exists"

return

if os.path.isdir(top_dir)==False:

print "not a dir"

return

for dir_path,subpaths,files in os.walk(top_dir,False):

for file in files:

file_path=os.path.join(dir_path,file)

print "delete file:%s" %file_path

os.remove(file_path)

print "delete dir:%s" %dir_path

os.rmdir(dir_path)

#調用

Remove_dir(r"C:\Users\Administrator\Desktop\zrbuN7zRuc")

二、os.path.walk

函數聲明:os.path.walk(top,func,arg)

(1)參數top表示需要周遊的目錄路徑

(2)參數func表示回調函數,即對周遊路徑進行處理的函數。所謂回調函數,是作為某個函數的參數使用,當某個時間觸發時,程式将調用定義好的回調函數處理某個任務。注意:walk的回調函數必須提供三個參數:第1個參數為os.path.walk的參數arg,第2個參數表示目錄dirname,第3個參數表示檔案清單names。注意:os.path.walk的回調函數中的檔案清單不和os.walk()那樣将子目錄和檔案分開,而是混為了一攤,需要在回調函數中判斷是檔案還是子目錄。

(3)參數arg是傳遞給回調函數的元組,為回調函數提供處理參數,arg可以為空。回調函數的第1個參數就是用來接收這個傳入的元組的。

過程:以top 為根的目錄樹中的每一個目錄 (包含 top 自身,如果它是一個目錄),以參數 (arg, dirname, names)調用回調函數 funct。參數 dirname 指定通路的目錄,參數 names 列出在目錄中的檔案(從 os.listdir(dirname)中得到)。回調函數可以修改 names 改變 dirname 下面通路的目錄的設定,例如,避免通路樹的某一部分。(由 names 關連的對象必須在合适的位置被修改,使用 del 或 slice 指派。) 注意:符号連接配接到目錄不被作為一個子目錄處理,并且是以 walk()将不通路它們。通路連接配接的目錄你必須以os.path.islink(file) 和 os.path.isdir(file)辨別它們,并且必須調用walk() 。

os.path.walk使用執行個體:周遊檔案夾下所有檔案(os.path.walk()不能用于删除檔案夾(可能是我沒想到),因為os.path.walk()先周遊頂級目錄,再周遊子目錄中的檔案)。

#! /usr/bin/env python

#coding=utf-8

import os

#回調函數

def find_file(arg,dirname,files):

for file in files:

file_path=os.path.join(dirname,file)

if os.path.isfile(file_path):

print "find file:%s" %file_path

#調用

os.path.walk(r"C:\Users\Administrator\Desktop\4",find_file,())

差別:os.path.walk()與os.walk()産生的檔案名清單并不相同.os.walk()産生目錄樹下的目錄路徑和檔案路徑,而os.path.walk()隻産生檔案路徑(是子目錄與檔案的混合清單)。