python中os.walk是一個(gè)簡(jiǎn)單易用的文件甚负、目錄遍歷器柬焕,可以幫助我們高效的處理文件、目錄方面的事情梭域。
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的子目錄(深度遍歷病涨,默認(rèn)為開(kāi)啟)
onerror 需要一個(gè) callable 對(duì)象富玷,當(dāng)walk需要異常時(shí),會(huì)調(diào)用
followlinks 如果為真既穆,則會(huì)遍歷目錄下的快捷方式(linux 下是 symbolic link)實(shí)際所指的目錄(默認(rèn)關(guān)閉)
os.walk 的返回值是一個(gè)生成器(generator),也就是說(shuō)我們需要不斷的遍歷它赎懦,來(lái)獲得所有的內(nèi)容。
每次遍歷的對(duì)象都是返回的是一個(gè)三元組(root,dirs,files)
root 所指的是當(dāng)前正在遍歷的這個(gè)文件夾的本身的地址
dirs 是一個(gè) list 幻工,內(nèi)容是該文件夾中所有的目錄的名字(不包括子目錄)
files 同樣是 list , 內(nèi)容是該文件夾中所有的文件(不包括子目錄)
如果topdown 參數(shù)為真励两,walk 會(huì)遍歷top文件夾,與top文件夾中每一個(gè)子目錄会钝。
舉個(gè)例子
如果我們有如下的文件結(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'):
#第一次運(yùn)行時(shí)伐蒋,當(dāng)前遍歷目錄為 a
所以 root == 'a'
dirs == [ 'b', 'c', 'd']
files == [ '4.txt', '5.txt']
# 接著遍歷 dirs 中的每一個(gè)目錄
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.簡(jiǎn)單的例子
保持目錄 a 的目錄結(jié)構(gòu)俭正,在 b 中創(chuàng)建對(duì)應(yīng)的文件夾,并把a(bǔ)中所有的文件加上后綴 _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:
# 把文件名分解為 文件名.擴(kuò)展名
# 在這里可以添加一個(gè) filter奸鬓,過(guò)濾掉不想復(fù)制的文件類(lèi)型,或者文件名
(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)
轉(zhuǎn)載自http://www.reibang.com/p/bbad16822eab