python中os.walk是一個簡單易用的文件、目錄遍歷器攀痊,可以幫助我們高效的處理文件、目錄方面的事情躁锁。
1.載入
要使用os.walk,首先要載入該函數(shù)
可以使用以下兩種方法
- import os
- from os import walk
2.使用
os.walk的函數(shù)聲明為:
walk(top, topdown=True, onerror=None, followlinks=False)
參數(shù)
- top 是你所要便利的目錄的地址
- topdown 為真,則優(yōu)先遍歷top目錄卵史,否則優(yōu)先遍歷top的子目錄(默認為開啟)
- onerror 需要一個 callable 對象战转,當(dāng)walk需要異常時,會調(diào)用
- followlinks 如果為真以躯,則會遍歷目錄下的快捷方式(linux 下是 symbolic link)實際所指的目錄(默認關(guān)閉)
os.walk 的返回值是一個生成器(generator),也就是說我們需要不斷的遍歷它槐秧,來獲得所有的內(nèi)容。
每次遍歷的對象都是返回的是一個三元組(root,dirs,files)
- root 所指的是當(dāng)前正在遍歷的這個文件夾的本身的地址
- dirs 是一個 list 忧设,內(nèi)容是該文件夾中所有的目錄的名字(不包括子目錄)
- files 同樣是 list , 內(nèi)容是該文件夾中所有的文件(不包括子目錄)
如果topdown 參數(shù)為真刁标,walk 會遍歷top文件夾,與top文件夾中每一個子目錄址晕。
舉個例子
如果我們有如下的文件結(jié)構(gòu):
a -> b -> 1.txt, 2.txt
c -> 3.txt
d ->
4.txt
5.txt
for (root, dirs, files) in os.walk('a'):
#第一次運行時膀懈,當(dāng)前遍歷目錄為 a
所以 root == 'a'
dirs == [ 'b', 'c', 'd']
files == [ '4.txt', '5.txt']
。谨垃。启搂。
# 接著遍歷 dirs 中的每一個目錄
b: root = 'a\\b'
dirs = []
files = [ '1.txt', '2.txt']
# dirs為空,返回
# 遍歷c
c: root = 'a\\c'
dirs = []
files = [ '3.txt' ]
PS : 如果想獲取文件的全路徑乘客,只需要
for f in files:
path = os.path.join(root,f)
# 遍歷d
d: root = 'a\\b'
dirs = []
files = []
遍歷完畢狐血,退出循環(huán)
3.簡單的例子
保持目錄 a 的目錄結(jié)構(gòu),在 b 中創(chuàng)建對應(yīng)的文件夾,并把a中所有的文件加上后綴 _bak
import os
Root = 'a'
Dest = 'b'
for (root, dirs, files) in os.walk(Root):
new_root = root.replace(Root, Dest, 1)
if not os.path.exists(new_root):
os.mkdir(new_root)
for d in dirs:
d = os.path.join(new_root, d)
if not os.path.exists(d):
os.mkdir(d)
for f in files:
# 把文件名分解為 文件名.擴展名
# 在這里可以添加一個 filter易核,過濾掉不想復(fù)制的文件類型匈织,或者文件名
(shotname, extension) = os.path.splitext(f)
# 原文件的路徑
old_path = os.path.join(root, f)
new_name = shotname + '_bak' + extension
# 新文件的路徑
new_path = os.path.join(new_root, new_name)
try:
# 復(fù)制文件
open(new_path, 'wb').write(open(old_path, 'rb').read())
except IOError as e:
print(e)
by Q'Boy 2017-3-10 10:12:13