一、什么是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()函数的使用方法,包括遍历文件和目录、筛选文件、筛选目录、根据文件大小过滤、根据修改日期进行过滤等。这些方法可以帮助您更有效地管理您的文件和目录。