官术网_书友最值得收藏!

3.2 遍歷目錄樹

當我們在使用 open 函數打開一個文件時,如果以'r'模式打開一個不存在的文件,系統會拋出異常,這往往不是我們想要看到的結果。因此,如果我們能在打開之前先確認文件是存在的,就可以避免這樣的異常出現。針對文件我們除了進行搜索文件、篩選文件及給文件重命名這些常規操作,可能還會涉及遍歷某個文件夾下面的所有子文件夾和文件等操作。利用 Python 提供的 os 模塊可以很方便地完成這些操作,而且由于 Python語法簡潔,其用到的代碼非常少。

【例3-12】 輸出指定路徑下的所有文件(不包括子文件夾下的文件)。

基本思路:先列出指定目錄下所有的文件夾和文件,然后逐個判斷是否為文件,若是則打印輸出。

在對文件進行操作的時候,有時往往需要遍歷指定路徑下的所有文件(包括子文件夾下的所有文件),Python的os模塊包含了很多有關文件、文件夾操作的方法。os模塊的常用方法如表3-4所示。

表3-4 os模塊的常用方法

【例 3-13】 有如下目錄樹結構,利用 os.walk(path)列出指定目錄下的所有的文件夾和文件(包括子文件夾及子文件夾下的文件)。

以上代碼中的dirpath為根目錄,dienames為子目錄,files為根目錄下的文件。

但是要注意,os.walk(path)遍歷的是指定目錄下的整個目錄樹,所謂的根目錄(字符串)、子目錄(列表)、根目錄下的文件(列表)是一層一層相對而言的。

【例3-14】 將指定目錄生成目錄樹。

溫馨提示:在以上程序運行之前,請確保你的電腦里有相應的目錄結構;否則,請按照你電腦的目錄結構先修改程序中的倒數第二行代碼,然后再運行。以上結果是在作者的電腦上運行程序后得到的,只能作為參考。

【例3-15】 輸出指定路徑下的文件及所有子文件夾下的文件。

注意:從控制臺輸入的必須是絕對路徑!

os.walk()是 Python 的內置函數,用于通過在目錄樹中游走來輸出目錄中的文件名。該函數創建一個生成器對象來遍歷整棵目錄樹。

os.walk()方法的語法格式如下:

各參數的含義如下:

top——指定遍歷的目錄,返回的是一個三元組(root,dirs,files)。請注意,返回的不是一個含三個元素的元組,而是一個生成器。該生成器的每個元素是一個含三個元素的元組。可以使用 for-in 遍歷循環輸出生成器中的每個元素,因為生成器也是可迭代對象。至于如何輸出os.walk()所返回的生成器里的元素,請看后面的例子。

root——當前正在遍歷的目錄,是一個字符串。

dirs——是一個列表,指定目錄下所有的文件夾名(但不包括子文件夾名)。

files——同樣是列表,指定目錄下的所有文件名(但不包括子文件夾下的文件)。注意,這些文件名不包含路徑信息。如果需要得到完整的路徑信息,需要使用 os.path.join(str_dirpath,list_filenames)進行拼接。

topdown——可選,為 True,則先遍歷 top 目錄;否則,優先遍歷 top 的子目錄(默認為 True)。如果 topdown 參數為 True,將會遍歷 top 文件夾及 top 文件夾中的每個子目錄。

onerror——可選,默認為 None,表示忽略文件遍歷時產生的錯誤。如果不為None,則用一個自定義函數來提示錯誤信息后是繼續遍歷還是拋出異常中止遍歷。

【例 3-16】 測試 os.walk()輸出的是一個生成器,并且該生成器的每個元素是一個含三個元素的元組。元組的第一個元素是一個字符串,第二、三個元素都是一個列表。

假設在本地D盤上有以下目錄結構:

觀察并理解以下每一條語句執行后所呈現的結果。

我們看到,通過 os.walk()方法可以得到指定目錄下的所有文件夾名和文件名。注意,它們是分層呈現的。請結合上面的輸出結果來理解 os.walk()的作用,進而掌握它的用法。

【例3-17】 輸出指定路徑下包括子文件夾的所有文件。

主站蜘蛛池模板: 涞水县| 登封市| 大姚县| 湖南省| 隆回县| 台安县| 玉田县| 蓝田县| 合水县| 黄平县| 靖安县| 巴楚县| 青铜峡市| 东乡族自治县| 阳高县| 裕民县| 瓦房店市| 涡阳县| 灵石县| 华容县| 黎城县| 云阳县| 丰台区| 桑植县| 桃源县| 温宿县| 彩票| 灵丘县| 七台河市| 龙川县| 大理市| 海口市| 玉屏| 新昌县| 平舆县| 阜平县| 深泽县| 环江| 武安市| 大英县| 常德市|