1. 文件夹结构

准备如下文件夹结构作为演示:

在这里插入图片描述

打开git bash,输入以下命令,创建文件夹结构:

# 创建目录
mkdir -p /e/Code/Python/searchFile
cd /e/Code/Python/searchFile
mkdir a b txt

# 创建文件
cd a
touch {a,test}.txt
cd ../b
touch {b,test}.txt
cd ../txt
touch test.txt

2. 查找指定文件夹下所有相同名称的文件

解法一:封装一个递归函数用于查找文件

  • 列出指定文件夹下所有的项(目录和文件)
  • 判断该项是目录还是文件,如果是目录则继续递归查找该目录,如果是文件则判断该文件名是不是查找的文件
import os

# 查找指定文件夹下所有相同名称的文件
def search_file(dirPath, fileName):
    items = os.listdir(dirPath) # 查找该层文件夹下所有的文件及文件夹,返回列表
    for item in items:
        fullPath = dirPath + '/' + item # 得到当前项的完整路径
        if os.path.isdir(fullPath): # 如果是目录则递归,继续查找该目录下的文件
            search_file(fullPath, fileName)
        elif item == fileName:
            print(fullPath) 

if __name__ == "__main__":
    dirPath = 'E:/Code/Python/searchFile' 
    fileName = 'test.txt'
    search_file(dirPath, fileName)
        

运行结果如下:

在这里插入图片描述

解法二:使用函数 os.walk(dirPath),该函数会遍历指定目录,并遍历该目录下的子目录,每次遍历时会返回三个值(root, dirs, files)

  • root:当前根目录,返回字符串
  • dirs:根目录下的所有子目录,返回列表
  • files:根目录下的所有子文件,返回列表
import os

for root, dirs, files in os.walk('E:/Code/Python/searchFile'):
    print('root={}, dirs={}, files={}'.format(root,dirs,files))   

运行以上代码,得到结果如下:

在这里插入图片描述

根据以上运行结果可知,files列表存的是所有文件名,因此只需要每次遍历files列表,判断文件列表中的文件名是不是查找的文件即可。

import os

# 查找指定文件夹下所有相同名称的文件
def search_file(dirPath, fileName):
    for root, dirs, files in os.walk(dirPath):
        for item in files:
            fullPath = os.path.join(root,item) # 得到当前文件的完整路径
            if item == fileName:
                print(fullPath)

if __name__ == "__main__":
    dirPath = 'E:/Code/Python/searchFile' 
    fileName = 'test.txt'
    search_file(dirPath, fileName)
    

运行结果如下:

在这里插入图片描述

3. 查找指定文件夹下所有相同后缀名的文件

获取相同后缀名的文件,只需要把上述代码中,判断相同文件名的条件,改为判断相同文件后缀名即可。

获取文件后缀名的方法:

  • fileName.split('.')[-1],获取文件的后缀名(不带.
  • os.path.splitext(fileName)[-1],获取文件的后缀名(带.
import os

fileName = 'a.txt'
print(fileName.split('.')[-1]) # txt
print(os.path.splitext(fileName)[-1]) # .txt 

解法一:封装一个递归函数用于查找文件

import os

# 查找指定文件夹下所有相同后缀名的文件
def search_file(dirPath, suffix):
    items = os.listdir(dirPath) 
    for item in items:
        fullPath = dirPath + '/' + item 
        if os.path.isdir(fullPath): # 如果是目录则递归,继续查找该目录下的文件
            search_file(fullPath, suffix)
        elif item.split('.')[-1] == suffix: # 判断文件的后缀名是否相同
            print(fullPath) 

if __name__ == "__main__":
    dirPath = 'E:/Code/Python/searchFile' 
    suffix = 'txt'
    search_file(dirPath, suffix)
             

运行结果如下:

在这里插入图片描述

注意:查找相同后缀名的文件时,递归调用必须放在if里,而不能放在elif里,否则当文件夹名称与文件后缀名相同时,会出错。
例如:查找txt后缀的文件,刚好又有一个txt的文件夹,因为递归放在了elif里,那么遍历会停在txt文件夹,而不去遍历txt文件夹里的内容。

解法二:使用函数 os.walk(dirPath)查找文件

import os

# 查找指定文件夹下所有相同后缀名的文件
def search_file(dirPath, suffix):
    for root, dirs, files in os.walk(dirPath):
        for item in files:
            fullPath = os.path.join(root,item) # 得到当前文件的完整路径
            if item.split('.')[-1] == suffix: # 判断文件的后缀名是否相同
                print(fullPath)

if __name__ == "__main__":
    dirPath = 'E:/Code/Python/searchFile' 
    suffix = 'txt'
    search_file(dirPath, suffix)
    

运行结果如下:

在这里插入图片描述

注:如果需要删除文件,把上述代码中的print(fullPath)改为os.remove(fullPath)即可

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐