文章目录
- 1. 文件夹结构
- 2. 查找指定文件夹下所有相同名称的文件
- 3. 查找指定文件夹下所有相同后缀名的文件
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)
即可