国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 肃北| 龙陵县| 阿城市| 内乡县| 淮阳县| 娱乐| 太湖县| 永州市| 抚松县| 绥化市| 唐河县| 离岛区| 曲阜市| 沁水县| 弋阳县| 黄骅市| 盐城市| 桂平市| 女性| 河间市| 股票| 新绛县| 秦安县| 忻城县| 德化县| 阜宁县| 吴忠市| 岳池县| 杭锦旗| 独山县| 昔阳县| 茶陵县| 梨树县| 剑河县| 屯留县| 当涂县| 图们市| 甘肃省| 宁陵县| 凌海市| 博客|