【Python学习笔记】文件检索方法os.listdir()、os.walk()和os.scandir()
文章目录
遍历文件时常用的三种方法:os.listdir()、os.walk()和os.scandir()
1. os.listdir()
返回指定目录下的所有文件和目录名(不包含子目录的内容)组成的列表,当你只需要获取一个目录中的所有文件和文件夹名称时可以使用该方法。
import os
def test_listdir(path: str):
"""
os.listdir方法返回一个指定path当前目录下的所有条目(包括文件和文件夹在内)名称组成的列表
:param path:
:return:
"""
print(os.listdir(path)) # ['init.csv', 'regions']
# 一般用法
for file_name in os.listdir(path):
print(file_name)
if __name__ == '__main__':
"""
file_path目录结构:
-init
-regions
1.csv
2.csv
...
init.csv
"""
file_path = r"E:\07-code\remote_study\tunnelProject\outer\data\init"
test_listdir(file_path)
2. os.scandir()
返回一个迭代器,用于遍历目录中的条目。每个条目是一个 DirEntry
对象,包含关于文件或目录的详细信息(比如文件名称、文件路径、文件类型等等)。当你需要高效地获取目录条目的详细信息时可以使用该方法。
import os
def test_scandir(path: str):
# <nt.ScandirIterator object at 0x000001FC4E1C6120> 返回一个所给路径的DirEntry对象的迭代器
print(os.scandir(path))
# 一般用法
with os.scandir(path) as entries:
for entry in entries:
print(entry) # 打印当前目录中所有条目的DirEntry对象
print(entry.path) # 打印文件路径
print(entry.name) # 打印文件名称
entry.is_file() # 判断条目是否是文件
entry.is_dir() # 判断条目是否是目录
def test_scandir_csv(path: str):
"""
示例:获取path目录中后缀为.csv的文件路径
:param path:
:return:
"""
with os.scandir(path) as entries:
for entry in entries:
if entry.is_file() and entry.name.endswith('.csv'):
print(entry.path)
# print(f"Csv File: {entry.name}") # Csv File: 1.csv ...
if __name__ == '__main__':
"""
file_path目录结构:
-init
-regions
1.csv
2.csv
...
init.csv
"""
file_path = r"E:\07-code\remote_study\tunnelProject\outer\data\init"
test_scandir(file_path)
# 示例用法
test_scandir_csv(file_path)
3. os.walk()
递归地生成目录树下的所有文件名。它是一个生成器,返回一个三元组 (dirpath, dirnames, filenames)
。每次迭代返回一个三元组 (dirpath, dirnames, filenames)
,分别表示当前目录路径、当前目录下的子目录列表和当前目录下的文件列表。当你需要递归地遍历目录及其子目录,处理整个目录树时可以使用该方法。
import os
def test_walk(path):
"""
os.walk: 目录树生成器
生成目录树中的文件名,方式是按上->下或下->上顺序浏览目录树
对于以 path 为根的目录树中的每个目录(包括 path 本身)
返回结果是一个三元组,包括:文件所在目录路径、当前路径中的目录名称组成的列表、当前路径中非目录的文件名称组成的列表
:param path:
:return:
"""
print(os.walk(path)) # <generator object walk at 0x00000209E538BF48>
for root, folders, files in os.walk(path):
"""
E:\07-code\remote_study\tunnelProject\outer\data\init
['regions']
['init.csv']
E:\07-code\remote_study\tunnelProject\outer\data\init\regions
[]
['1.csv', '2.csv', ...]
从结果可以看出默认是按照是从上至下的顺序浏览目录树的
"""
print(root)
print(folders)
print(files)
def test_walk_csv(path: str):
"""
示例: 获取目录及其子目录中所有后缀为.csv的文件路径
:param path:
:return:
"""
for root, folders, files in os.walk(path):
for file in files:
if file.endswith('.csv'):
# E:...\data\init\init.csv, E:...\data\init\regions\1.csv ...
print(os.path.join(root, file))
if __name__ == '__main__':
"""
file_path目录结构:
-init
-regions
1.csv
2.csv
...
init.csv
"""
file_path = r"E:\07-code\remote_study\tunnelProject\outer\data\init"
test_walk(file_path)
# 示例
test_walk_csv(file_path)
4. os.listdir()和os.scandir()
os.listdir()
:返回的是一个包含所有文件名的列表,文件数量较多时需要更多的内存来存储所有文件名,并且在获取文件类型等其他信息时需要额外的系统调用。os.scandir()
:返回的是一个迭代器,包含DirEntry
对象,每个对象只有在访问其属性时才会进行系统调用。这样可以减少不必要的系统调用和内存使用,尤其是在只需要处理部分文件或需要访问文件的详细信息时。
os.listdir()
和os.scandir()
都时获取当前目录中的文件信息,所以当目录中文件数量较多时可以直接使用os.scandir()
方法提高文件检索效率,因为 os.scandir()
返回的是一个包含 DirEntry
对象的迭代器,这些对象在需要时才会查询文件的详细信息,而不是一次性获取所有文件的详细信息,这可以显著减少开销和内存使用。
5. 总结
os.listdir()
:简单列出目录中的所有文件和文件夹名称,适用于浅层次的目录遍历。os.walk()
:递归地遍历目录树,适用于深层次的目录遍历。os.scandir()
:提供DirEntry
对象的迭代器,能够高效地访问目录条目的详细信息,适用于需要更多文件属性信息的场景。