簡體   English   中英

在 Python 中檢查目錄是否為空的最快方法是什么

[英]What is the fastest way to check whether a directory is empty in Python

我在 Windows 機器上工作,想檢查網絡路徑上的目錄是否為空。

想到的第一件事是調用os.listdir()並查看它的長度是否為 0。

IE

def dir_empty(dir_path):
    return len(os.listdir(dir_path)) == 0

因為這是一個網絡路徑,我的連接並不總是很好,而且一個文件夾可能包含數千個文件,所以這是一個非常慢的解決方案。 有沒有更好的?

迄今為止我找到的最快的解決方案:

def dir_empty(dir_path):
    return not any((True for _ in os.scandir(dir_path)))

或者,如以下評論中所建議的:

def dir_empty(dir_path):
    return not next(os.scandir(dir_path), None)

在我正在處理的慢速網絡上,這需要幾秒鍾而不是幾分鍾(os.listdir() 版本是幾分鍾)。 這似乎更快,因為 any 語句只評估第一個 True 語句。

從 Python 3.4 開始,您可以使用pathlib.iterdir()這將產生目錄內容的路徑對象:

>>> from pathlib import Path
>>>
>>> def dir_empty(dir_path):
...     path = Path(dir_path)
...     has_next = next(path.iterdir(), None)
...     if has_next is None:
...             return True
...     return False

由於 OP 詢問最快的方式,我認為使用os.scandir並在我們發現第一個文件后立即返回應該是最快的。 os.scandir返回一個迭代器。 我們應該避免創建一個完整的列表來檢查它是否為空。

測試目錄包含大約 10 萬個文件:

from pathlib import Path    
import os

path = 'jav/av'
len(os.listdir(path))

>>> 101204

然后開始我們的測試:

def check_empty_by_scandir(path):
    with os.scandir(path) as it:
        return not any(it)
    
def check_empty_by_listdir(path):
    return not os.listdir(path)

def check_empty_by_pathlib(path):
    return not any(Path(path).iterdir())


%timeit check_empty_by_scandir(path)
>>> 179 µs ± 878 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit check_empty_by_listdir(path)
>>> 28 ms ± 185 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit check_empty_by_pathlib(path)
>>> 27.6 ms ± 140 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

如我們所見, check_empty_by_listdircheck_empty_by_pathlibcheck_empty_by_scandir慢約 155 倍。 os.listdir() 和 Path.iterdir() 的結果是相同的,因為 Path.iterdir() 在后台使用 os.listdir() ,在內存中創建了一個完整的列表。

此外,正如人們指出的那樣,讀取 os.stat 不是一種選擇,它在 linux 中的空目錄上返回 4096。

listdir給出了一個列表。 scandir給出了一個迭代器,它的性能可能更高。

def dir_empty(dir_path):
    try:
        next(os.scandir(dir_path))
        return False
    except StopIteration:
        return True

在 Windows 操作系統上有PathIsDirectoryEmptyA 我們可以用它來檢查文件夾是否為空。

def is_dir_empty(path:str)->bool:
    import ctypes
    shlwapi = ctypes.OleDLL('shlwapi')
    return shlwapi.PathIsDirectoryEmptyA(path.encode('utf-8'))

使用os.stat

is_empty = os.stat(dir_path).st_size == 0

使用 Python 的pathlib

from pathlib import Path

is_empty = Path(dir_path).stat().st_size == 0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM