Python 三種遍歷目錄的方法,輕鬆幫你找出隱藏文件

閱讀文本大概需要 6 分鐘。

無論在 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)

運行結果,同樣也是能找出隱藏文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章