無論在 Windows 系統中還是 Linux 系統中,都存在着隱藏文件以及隱藏文件夾。隱藏文件夾一般是系統關鍵性目錄,例如 Windows 系統中的 C 盤中的 Boot 文件夾、Windows 文件夾等。在 Linux 系統中,一些系統配置文件或軟件配置文件會被隱藏起來,如:系統環境變量配置文件 .profile。有些時候,我們必須通過文件路徑來遍歷整個目錄,然後找到隱藏文件。本文的主要內容是給大家分享 Python 三種遍歷文件的方法。
01
簡單暴力法-遞歸
假設在 E 盤中,有個名爲“Python”的文件夾;該文件夾中也有兩個文件夾,分別是“A”和“B”;另外,在“A”文件夾中還有一個 “results.txt” 的文本文件。因此,“Python”文件夾的文件結構如下:
Python |--A | |--results.txt |--B
我們可以從上述看出,一個文件夾其實是一個樹型的數據結構。遍歷樹的最簡單、最暴力的辦法就是遞歸。因此,遍歷“Python”的文件夾的代碼可以這麼寫。
# -*- coding: UTF-8 -*- import os # 遞歸遍歷目錄 def traversal_files(path): for dir in os.listdir(path): dir = os.path.join(path, dir) print(dir) # 判斷當前目錄是否爲文件夾 if os.path.isdir(dir): traversal_files(dir) if __name__ == '__main__': path = '.' traversal_files(path)
運行腳本程序後,發現“Python”中的文件和文件夾都被打印出來。
這種遍歷方法能否找出隱藏文件?答案是肯定能。讓我們來驗證一番。首先,我們在“Python”的文件夾中放入一個“config.txt”的隱藏文件。
然後再運行程序,結果發現“config.txt”被打印出來。
這種辦法雖然寫起來代碼簡潔,但是在文件夾的子目錄層級過深的情況下,效率會比較低。
02
優雅的 os.walk()
既然遞歸太暴力,那麼使用 os.walk() 會讓程序顯得優雅。os.walk() 方法是一個簡單易用的文件、目錄遍歷器,可以幫助我們高效的處理文件、目錄方面的事情。這個方法適用於在 Linix 和 Windows。
os.walk() 一般用法是傳入兩個參數。第一個參數是 path, 即所要遍歷的目錄的地址。它返回的是一個三元組(root, dirs, files)。
- root 所指的是當前正在遍歷的這個文件夾的本身的地址
- dirs 是一個 list ,內容是該文件夾中所有的目錄的名字(不包括子目錄)
- files 同樣是 list , 內容是該文件夾中所有的文件(不包括子目錄)
第二個參數是topdown,它是一個可選參數。當它的值爲 True 時,則優先遍歷 path 目錄,否則優先遍歷 top 的子目錄(默認爲開啓)。
因此,使用 os.walk 遍歷文件夾,找出隱藏文件的代碼如下所示。
# -*- coding: UTF-8 -*- import os def traversal_files(path): for root, dirs, files in os.walk(path, topdown=False): for name in files: print(os.path.join(root, name)) for name in dirs: print(os.path.join(root, name)) if __name__ == '__main__': path = '.' traversal_files(path)
03高效的 os.scandir()
在 Python 3.5版本中,新添加了 os.scandir()方法,它是一個目錄迭代方法。os.scandir() 的運行效率要比 os.walk 高。在 PEP 471 中,Python 官方也推薦我們使用 os.scandir() 來遍歷目錄。
按照前面的例子,遍歷“Python”的文件夾中的隱藏文件的代碼如下:
# -*- coding: UTF-8 -*- import os dirs = [] files = [] def traversal_files(path): for item in os.scandir(path): if item.is_dir(): dirs.append(item.path) elif item.is_file(): files.append(item.path) print('dirs:', dirs) print('files:', files) if __name__ == '__main__': path = '.' traversal_files(path)
運行結果,同樣也是能找出隱藏文件。