专栏首页数据医生专栏如何使用Python选择性地删除文件夹中的文件?

如何使用Python选择性地删除文件夹中的文件?

问题1

问题描述:在一个文件夹中,有着普通文件以及文件夹,那么我们如何做到删除全部文件夹而不删除文件呢?

如下图所示,我们想要删除test文件夹中的所有文件夹,而保留其他文件:

Version 1

看到这个问题的第一刻,我想到的是文件夹没有后缀名,其他文件有后缀名,而拥有后缀名则意味着文件名称里面会有.的存在,我们就可以利用这个差别,来区分两者,进而实现问题描述中的功能。于是我就写出了以下Python代码:

import os

os.chdir('H:\\学习代码\\test')    # 改变路径到想要进行操作的文件夹

file_list = os.listdir()
for file in file_list:
    # 通过split方法,文件夹名称的长度是1,也就是我们要删除的对象
    if len(file.split('.')) == 1:
        print('已删除:' + file)
        os.rmdir(file)

print('Finished.')

运行结果:

我们可以看到,test文件夹中的文件已经全部删除。

Version 2.0

但是,后来仔细一想,上面这种方法却存在一个非常大的问题,如果普通文件是没有后缀名,也就是文件名称中不存在.,这可怎么办?

接着,我又发现了文件夹和普通文件的另外一个区别,也就是文件夹是可以使用os.chdir("file_name")这个命令的,而普通文件则显然不行,会出现异常。所以,就写下了以下代码:

import os

os.chdir('H:\\学习代码\\test')

file_list = os.listdir()
for file in file_list:
    try:
        os.chdir(file)    # 如果能进入当前文件,说明该文件是文件夹
        os.chdir('..')    # 返回到上一层路径
        os.rmdir(file)    # 删除文件夹
        print('已删除:' + file)
    except NotADirectoryError:
        print('非文件夹:' + file)
print('Finished')

运行结果:

可以看到,文件夹已经删除,而没有后缀名的普通文件依然存在。

Version 2.1

使用os.walk()函数实现同样功能的另外一种写法:

import os

for roots, dirs, files in os.walk('H:\\学习代码\\test'):
    for dir in dirs:
        os.chdir('H:\\学习代码\\test')
        os.rmdir(dir)
print('Finished.')

问题2

问题描述:我们如何做到删除一个文件夹中的空白文件夹,而不删除其他文件呢?

可以看出,问题2是问题1的进阶版本,只需要在问题1的代码基础上,增加一个判断文件夹是否空白的语句即可。

import os

os.chdir('H:\\学习代码\\test')

file_list = os.listdir()
for file in file_list:
    try:
        os.chdir('H:\\学习代码\\test\\' + file)    # 如果能进入当前文件,说明该文件是文件
        if len(os.listdir()) == 0:
            os.chdir('..')    # 返回到上一层路径
            os.rmdir(file)    # 删除文件夹
            print('已删除:' + file)
        os.chdir('..')
    except NotADirectoryError:
        print('非文件夹:' + file)
print('Finished')

运行结果:

使用os.walk()函数实现同样功能的另外一种写法:

for roots, dirs, files in os.walk('H:\\学习代码\\test'):
    for dir in dirs:
        os.chdir('H:\\学习代码\\test\\' + dir)
        if len(os.listdir()) == 0:
            os.chdir('..')    # 返回到上一层路径
            os.rmdir(dir)
print('Finished.')

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 字符串 | Python

    注意:和split( )的区别在于,split( )返回的是列表,partition( )返回的是集合。

    数据医生
  • 文件 | Python

    定位读写(从一个指定位置开始进行读写) 1.获取当前的读写位置 tell( )

    数据医生
  • GPS数据Python解析及地图可视化

    本篇文章主要介绍如何使用pynmea2库解析传感器的GPS信号,以及如何使用folium库绘制GPS轨迹图。

    数据医生
  • java准确的获取操作系统的名称

    在我们日常开发中,经常需要判断操作系统的版本或者系统的名字等等。这就需要我们用到jdk默认带的一些属性了。这里我对各个版本的系统都做了区分,分别能判断mac,l...

    业余草
  • Python|恶搞C盘

    在烦劳日常生活中,为了给平凡的生活增添乐趣,常常会和朋友开一些玩笑。除了现实中的玩笑,对于学程序的人来说,自然也少不了网上的玩笑,所以今天小编给大家分享一个用p...

    算法与编程之美
  • 简易Ramdisk 镜像制作(基于Centos7+)

    考虑到实际应用中Ramdisk需要保持小而精,故在安装系统时选择最小化安装,然后再安装所需要的包。

    PedroQin
  • 使用 shadow DOM [MDN教程]

    Web components的一个重要特性是封装——可以将html标签结构、css样式和行为隐藏起来,并从页面上的其他代码中分离开来,这样不同的功能不会混在一起...

    Jean
  • 【使用Postman测试web接口】管理http请求

    Postman程序窗口可以划分为3个区域,包括Sidebar、请求编辑区、请求响应区。在Sidebar部分包含“History”和“Collection”选项卡...

    botkenni
  • 我的职业是前端工程师【十】客户端存储艺术:数据存储与模型

    Web或者移动应用的重心,由后台往前台挪动的两个标志是:客户端存储,客户端模型维护。在可见的未来,我们将会见证后端将不存储数据、由前端负责存储数据的应用。 写过...

    Phodal
  • CDN系列学习文章(八)——如何提高命中率

    提高命中率或者降低回源带宽,在CDN业务是最常见的问题。本文结合多年CDN实战经验,梳理总结如何提高业务缓存命中率。

    开元

扫码关注云+社区

领取腾讯云代金券