mvc删除指定文件夹内图片_【Python技术进阶6】Python遍历文件夹详细指南

在平时日常的生活或是工作中,会有很多场景要遍历文件夹下的所有文件。比如,下载的一堆数据文件或是图片,需要把文件的名称重命名为指定格式的文件名称;拷贝某个文件夹下的所有文件到另一个文件夹中;删除某个文件夹下指定后缀的文件;等等场景。都需要和文件夹遍历打交道。Python为我们提供了方便的调用接口来实现我们的需求。飞哥想起2016年在公司上班时,当时公司和一位重要的客户谈合作,演示图像识别的处理效果。客户发过来50组图像,每组图像有24张图片,命名从1,2,开始,一直到24。我们的软件,是拿来供测试用的demo,选择一个文件夹后,只能识别01,02,开始,到24的2位字符串的图像文件。刚开始时,销售人员为了测试一下效果,就对一组图像手动的修改文件名,测试了一下效果,没问题。但后面很多还有很多呀,手动改名太麻烦了。销售人员就找我,“最短的时间里,把这个事处理好,客户还等着看效果。”我说,“你把50组图像,拷贝到硬盘里,我10分钟内给你处理好。”于是打开Eclipse,都是熟悉的os模块以及os.paht模块中的几个函数调用,写了一个函数,不到10行代码就解决了。从拿来硬盘,到飞哥开始写代码,到开始简单的测试,到最后处理好,总共不到8分钟时间,飞哥就把重新命名好的50组图像,连同硬盘交给那位销售人员。销售人员打开测试软件,选择存放有50组图像的文件夹,几分钟后就出来了结果,全部搞定。接下来, 飞哥给小伙伴分享遍历文件夹的2种方法,第1种,使用os.walk()函数实现,第2种,使用os.listdir()函数+递归的方式实现。 01 使用os.walk()函数

1、os.walk(top, topdown=True, οnerrοr=None, followlinks=False)

功能:遍历指定文件夹中的所有文件和目录,包括子目录。返回的是一个生成器对象,生成器对象 每次返回一个三元组 (dirpath, dirnames, filenames)。 参数: top,需要遍历的文件夹路径。 topdown,默认为True,表示自顶而下的方式遍历,先遍历顶层目录(top指定的目录),然后才一层层的遍历子目录。若为False,表示自底而上的方式遍历,先遍历最底层的目录,最后才是遍历顶层的目录(top指定的目录),不同层级的目录类似倒序一样。 onerror,带有一个参数的回调函数,出错时此函数会被调用,参数是一个 OSError 对象。如果只是一个错误,回调函数调用后继续遍历。如果是抛出异常,回调函数调用后中止遍历。 followlinks,指示遍历时,如果遇到一个指向目录的符号链接,是否对这个符号链接指向的目录也进行遍历。默认为False,不遍历。

2、由于os.walk返回的是生成器,通常使用for循环的方式来调用。示例如下:

# -*- coding:utf-8 -*-import os# 遍历文件夹def walk_file(file):    for root, dirs, files in os.walk(file, False):        # root 表示当前正在遍历的文件夹目录路径        # dirs 表示当前正在遍历的文件夹下的所有子目录名称组成的列表(list)        # files 表示当前正在遍历的文件夹下的所有文件名称组成的列表(list)        # 输出正在遍历的文件夹下的所有文件路径        for f in files:            # 输出文件的全路径            print(os.path.join(root, f))        # 输出正在遍历的文件夹下的所有文件夹路径        for d in dirs:            # 输出文件夹的全路径            print(os.path.join(root, d))        if __name__ == '__main__':    walk_file("E:/test")

3、topdown参数在删除整个文件夹时特别有用,因为删除目录时,必须保证此目录是空目录。示例代码如下:

# 清空文件夹中的所有文件和文件夹 def remove_dir(dir_path):    for root, dirs, files in os.walk(dir_path, topdown=False):        # 先删除文件夹里面的文件        for name in files:            os.remove(os.path.join(root, name))                    # 此时文件夹是空的        for name in dirs:            os.rmdir(os.path.join(root, name))
4、 拷贝文件夹下的所有文件和文件夹到另一个文件夹。示例代码如下:
# 将一个文件夹中的所有文件拷贝到另一个文件夹def copy_files(src_dir, dst_dir):    # 源文件夹后面加一个反斜杠    # 后面取相对路径时就不会把斜杠取到    if src_dir[-1] not in ['\\', '/']:        src_dir = src_dir+'/'    root_len = len(src_dir)    for root, dirs, files in os.walk(src_dir):        # 保持和源目录相同的目录结构,        new_dst_dir = os.path.join(dst_dir, root[root_len:])        # print("dst:", new_dst_dir)                # 目标目录不存在时,先创建        if not os.path.exists(new_dst_dir):            os.makedirs(new_dst_dir)                    # 每个文件一次拷贝        for file in files:            src_file = os.path.join(root, file)            # print(src_file)            # 调用的是shutil模块中的copy函数            shutil.copy(src_file, new_dst_dir)

5、更方便的拷贝或删除整个文件夹的函数。

# 删除整个指定的目录,即使目录下有文件和文件夹。# 实际工作中要慎用,因为它会把整个目录(包括自己)都全删除shutil.rmtree(dst_path)# 把指定目录下的所有文件和文件夹拷贝到指定的目标目录中# 需要注意dirs_exist_ok,此值默认为False,# 此时,如果目标文件夹存在,则会抛出异常。# 可以修改为Trueshutil.copytree(src_path, dst_path, dirs_exist_ok=False)
02 使用os.listdir()函数+递归的方式

os.listdir(path='.')

功能:

遍历指定文件夹中的所有文件和目录,不包括对子目录的遍历。返回遍历到的文件或文件夹的名字组成的列表。

参数:

path,需要遍历的文件夹路径。

由于它不对子目录进行遍历,如果遍历到的是一个目录则需要递归调用。示例如下:
# -*- coding:utf-8 -*-import os# 递归的方式遍历文件夹def list_file(dir_path):    files = os.listdir(dir_path)    for f in files:        # 文件或文件夹的全路径        full_path = os.path.join(dir_path, f)        print(full_path)                # 如果是文件夹,则使用递归的方式继续遍历        if os.path.isdir(full_path):            list_file(full_path)if __name__ == '__main__':    list_file("E:/test")
03 总结

上面,飞哥给小伙伴讲解了2种遍历文件夹的方法,方便小伙伴需要时,直接把代码拿去用。当要对子目录也进行遍历时,强烈建议使用第一种os.walk的方式。因为使用第2种递归的方式,代码效率比较低,尤其是当子目录层级比较多时,会比较明显。

小伙伴有没有注意到,上面的2种遍历文件夹的函数,都用到了os模块,os模块提供了丰富的操作系统相关的功能接口函数,比如对文件或目录的创建、删除、重命名、文件是否存在、文件夹遍历等函数接口。此外os.path模块提供文件路径相关的操作,比如提取文件的后缀名以及文件文件名称。感兴趣的小伙伴可以自己使用dir()或help()来看看这2个模块的文档。

更多Python精彩文章、新手学习干货,欢迎一起交流学习!

END 640bebe37a395fb9d9fa9fa93f66bdcf.gif 扫码关注我们 59b6b242217c6e907df4f37a60a96189.png 专业提供 定制学习计划和职业规划服务 公众号:Python编程研习社 640bebe37a395fb9d9fa9fa93f66bdcf.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值