您的位置:

Python中的os.scandir详解

一、什么是os.scandir

os.scandir()是Python的os模块中的一个函数,它用于返回一个迭代器对象,该对象包含指定路径下的文件和目录信息。

它是Python 3.5中新添加的函数,与os.listdir()类似,但是比os.listdir()更加高效,尤其是在处理大型文件夹时。与os.listdir()返回一个列表不同,os.scandir()返回一个包含文件和目录信息的迭代器对象。这个迭代器可以遍历目录中的每一个文件或者目录信息,并且可以通过调用is_dir()is_file()来获取文件或目录的相应信息。

二、os.scandir的应用场景

os.scandir()可用于访问文件系统中的文件夹,可以获取文件夹中的文件和子目录信息,以及文件/目录访问权限、大小等。

相比于os.listdir(),os.scandir()在处理大型文件夹时更加高效,且在获取文件和目录信息时更为全面。

三、os.scandir基本用法示例

下面是一个典型的os.scandir()应用示例:

import os

with os.scandir('/mydir') as entries:
    for entry in entries:
        print(entry.name, entry.is_file(), entry.is_dir())

其中:
os.scandir(): 返回一个迭代器对象,该对象包含指定路径下的文件和目录信息。
with: 上下文管理器,可以自动关闭文件,避免资源泄露。
entry.name: 返回文件或目录的名称。
entry.is_file(): 如果entry对象是文件,则返回True。
entry.is_dir(): 如果entry对象是目录,则返回True。

四、如何筛选文件或目录

在上述示例中,我们并不能直接获取文件或目录的信息。在处理文件夹中包含大量文件的情况下,此时扫描文件夹通常会变得非常慢。此时,可以使用os.scandir()函数的一些过滤器来提高效率。

五、过滤器1:仅选择文件夹

os.scandir()不仅可以迭代文件,也可以迭代目录。如果只需要迭代目录,则需要用到is_dir()函数,也就是说,仅选择目录,可以使用下面的代码:

import os

with os.scandir('/mydir') as entries:
    for entry in entries:
        if entry.is_dir():
            print(entry.name)

这个例子可以实现列出/mydir目录下的所有目录。

六、过滤器2:仅选择文件

与过滤目录不同,如果只是列出一个目录中所有的文件,则需要使用is_file()函数,示例如下:

import os

with os.scandir('/mydir') as entries:
    for entry in entries:
        if entry.is_file():
            print(entry.name)

这个例子可以实现列出/mydir目录下的所有文件。

七、过滤器3:指定文件扩展名进行过滤

如果需要选择指定扩展名的文件,可以使用字符串模块中的endswith()函数。例如,如果需要选出所有.txt文件,则可以这样做:

import os

with os.scandir('/mydir') as entries:
    for entry in entries:
        if entry.name.endswith('.txt') and entry.is_file():
            print(entry.name)

这个例子可以实现列出/mydir目录下所有的.txt文件。

八、过滤器4:根据文件大小进行过滤

如果需要根据文件大小选择文件,可以使用Python中的os.path.getsize()函数。例如,如果您想选择所有大于10KB的文件,则可以这样写:

import os

with os.scandir('/mydir') as entries:
    for entry in entries:
        if entry.is_file() and os.path.getsize(entry.path)>1024*10:
            print(entry.name)

这个例子可以实现列出/mydir目录下大小大于10KB的所有文件。

九、过滤器5:根据修改日期进行过滤

如果需要根据文件的修改时间筛选文件,则可以使用entry.stat().st_mtime获取最后修改时间,时间单位是秒。如果需要将日期格式化为易于理解的格式,则可以使用datetime.datetime.fromtimestamp()。示例如下:

import os
import datetime

with os.scandir('/mydir') as entries:
    for entry in entries:
        if entry.is_file():
            modified_time = datetime.datetime.fromtimestamp(entry.stat().st_mtime)
            if modified_time < datetime.datetime(2019, 1, 1):
                print(entry.name)

这个例子可以实现列出/mydir目录下修改日期早于2019年1月1日的所有文件。

十、小结

os.scandir()是一个很有用的函数,它可以极大地加快处理大型文件夹的速度。这篇文章主要介绍了os.scandir()函数的使用方法,包括遍历文件和目录、筛选文件、筛选目录、根据文件大小过滤、根据修改日期进行过滤等。这些方法可以帮助您更有效地管理您的文件和目录。