国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

使用 Python 實(shí)現(xiàn)文件遞歸遍歷的三種方式

2020-02-15 22:27:44
字體:
供稿:網(wǎng)友

今天有個腳本需要遍歷獲取某指定文件夾下面的所有文件,我記得很早前也實(shí)現(xiàn)過文件遍歷和目錄遍歷的功能,于是找來看一看,嘿,不看不知道,看了嚇一跳,原來之前我竟然用了這么搓的實(shí)現(xiàn)。

先發(fā)出來看看:

def getallfiles(dir):"""遍歷獲取指定文件夾下面所有文件"""  if os.path.isdir(dir):    filelist = os.listdir(dir)    for ret in filelist:      filename = dir + "http://" + ret      if os.path.isfile(filename):        print filenamedef getalldirfiles(dir, basedir):"""遍歷獲取所有子文件夾下面所有文件"""  if os.path.isdir(dir):    getallfiles(dir)    dirlist = os.listdir(dir)    for dirret in dirlist:      fullname = dir + "http://" + dirret      if os.path.isdir(fullname):        getalldirfiles(fullname, basedir)

我是用了 2 個函數(shù),并且每個函數(shù)都用了一次 listdir,只是一次用來過濾文件,一次用來過濾文件夾,如果只是從功能實(shí)現(xiàn)上看,一點(diǎn)問題沒有,但是這…太不優(yōu)雅了吧。

開始著手優(yōu)化,方案一:

def getallfiles(dir):"""使用listdir循環(huán)遍歷"""  if not os.path.isdir(dir):    print dir    return  dirlist = os.listdir(dir)  for dirret in dirlist:    fullname = dir + "http://" + dirret    if os.path.isdir(fullname):      getallfiles(fullname)    else:      print fullname

從上圖可以看到,我把兩個函數(shù)合并成了一個,只調(diào)用了一次 listdir,把文件和文件夾用 if~else~ 進(jìn)行了分支處理,當(dāng)然,自我調(diào)用的循環(huán)還是存在。

有木有更好的方式呢?網(wǎng)上一搜一大把,原來有一個現(xiàn)成的 os.walk() 函數(shù)可以用來處理文件(夾)的遍歷,這樣優(yōu)化下就更簡單了。

方案二:

def getallfilesofwalk(dir):"""使用listdir循環(huán)遍歷"""  if not os.path.isdir(dir):    print dir    return  dirlist = os.walk(dir)  for root, dirs, files in dirlist:    for file in files:      print os.path.join(root, file)

只是從代碼實(shí)現(xiàn)上看,方案二是最優(yōu)雅簡潔的了,但是再翻看 os.walk() 實(shí)現(xiàn)的源碼就會發(fā)現(xiàn),其實(shí)它內(nèi)部還是調(diào)用的 listdir 完成具體的功能實(shí)現(xiàn),只是它對輸出結(jié)果做了下額外的處理而已。

附上os.walk()的源碼:

from os.path import join, isdir, islink# We may not have read permission for top, in which case we can't# get a list of the files the directory contains. os.path.walk# always suppressed the exception then, rather than blow up for a# minor reason when (say) a thousand readable directories are still# left to visit. That logic is copied here.try:  # Note that listdir and error are globals in this module due  # to earlier import-*.  names = listdir(top)except error, err:  if onerror is not None:    onerror(err)  returndirs, nondirs = [], []for name in names:  if isdir(join(top, name)):    dirs.append(name)  else:    nondirs.append(name)if topdown:  yield top, dirs, nondirsfor name in dirs:  path = join(top, name)  if followlinks or not islink(path):    for x in walk(path, topdown, onerror, followlinks):      yield xif not topdown:  yield top, dirs, nondirs            
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 赞皇县| 河曲县| 峨山| 沅陵县| 大理市| 合川市| 龙泉市| 涟源市| 蒙阴县| 夹江县| 贵南县| 旬阳县| 当雄县| 武山县| 团风县| 比如县| 庆元县| 泸州市| 泰顺县| 宜君县| 鄂伦春自治旗| 南丹县| 台中市| 巫溪县| 娱乐| 土默特右旗| 保德县| 桃园县| 遂溪县| 桑植县| 西昌市| 金沙县| 罗甸县| 六安市| 台东县| 杭锦后旗| 台南市| 新巴尔虎右旗| 南江县| 鲜城| 南充市|