【通用文件操作】删除空文件夹

606 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

一、前言

对于有强迫症的人来说,空文件夹是不允许存在的东西,而电脑中文件又特别多,而且空文件夹也不好找,要一个一个删除真的是太麻烦了,今天就和大家分享一下删除空文件夹的操作。文章比较啰嗦,读者可以直接跳到最后一段。

二、Python的os模块

在Python的os模块中,封装了对文件和路径的操作,我们只需要几行代码就能遍历文件,删除空文件夹。下面我们来看看我们要用到一些操作。

1、查看目录下文件

在os中提供了一个listdir的函数用于查看目录下的文件和文件夹,具体使用如下:

import os
# 列出当前目录下的文件/文件夹
file_list = os.listdir(".")
# 输出返回的文件/文件夹列表
print(file_list)

输出结果如下:

['.idea', 'dataset', 'main.py', 'nn', 'test', 'test.py', 'venv']

可以看到,返回结果的列表里面存放了当前目录下的文件和文件夹名称。

2、拼接路径

为了安全准确的访问我们的文件,我更推荐用绝对路径的方式访问。这个时候我们就可以借助os.listdir生成文件的绝对路径列表,代码如下:

import os
# 获取当前目录的绝对路径
abs_path = os.path.abspath(".")
# 用于装文件的绝对路径
file_list = []
# 循环拼接
for file in os.listdir(abs_path):
    file_list.append(abs_path + "\\" + file)
print(file_list)

输出结果如下:

['D:\\Coding Files\\Workplace\\PythonWorkplace\\Deep Learning\\.idea', 'D:\\Coding Files\\Workplace\\PythonWorkplace\\Deep Learning\\dataset']

我们还用列表推导式可以简化一下上面的代码:

import os
abs_path = os.path.abspath(".")
file_list = [abs_path + "\\" + i for i in os.listdir(abs_path)]

不过直接拼接"\\"是不可取的,我们可以用os.path.join函数来进行拼接,使用方法如下:

import os
path = os.path.join('test', 'test.py')
# 输出结果:test\test.py

使用join函数的话可以自动适配不同系统的斜杠。我们把上面代码改成用join函数:

import os
abs_path = os.path.abspath(".")
file_list = [os.path.join(abs_path, i) for i in os.listdir('.')]
print(file_list)

这样我们就完成了路径的拼接。

3、判断是文件还是文件夹

这里也有现成的函数:

import os
abs_path = os.path.abspath(".")
file_list = [os.path.join(abs_path, i) for i in os.listdir('.')]
for file in file_list:
    # 判断是否是文件夹
    if os.path.isdir(file):
        print(file, "是文件夹")
    # 判断是否是文件
    elif os.path.isfile(file):
        print(file, "是文件")

这里主要就是下面两个函数:

os.path.isdir(file)
os.path.isfile(file)

另外我们可以看看判断目录是否为空,这里就比较特别了:

if not os.listdir("test"):
    print("test目录是空的")

这里我们看它是否返回了子列表,如果没有说明目录下没有子文件因此是空的。

4、删除文件

这里需要使用的我们的os.rmdir函数,这里需要传入的目录是空目录才能正常运行,我们可以删除前判断一下是否为空目录:

if os.listdir("test"):
    os.rmdir("test")

三、批量删除空文件夹

下面我们可以结合一下上面的内容,实现批量删除空文件夹:

import os
abs_path = os.path.abspath(".")
file_list = [os.path.join(abs_path, i) for i in os.listdir('.')]
for file in file_list:
    if os.path.isdir(file) and not os.listdir(file):
        os.rmdir(file)
        print("删除了", file)

输出结果如下:

删除了 D:\Coding Files\Workplace\PythonWorkplace\Deep Learning\test11

这样我们就实现了批量删除指定目录下的空文件夹。但是我们应该如果删除全局的空文件夹呢?这里就需要用到walk函数遍历了:

import os
for root, dirs, files in os.walk(r"D:\\"):
    for file in files:
        # 获取文件路径
        path = os.path.join(root, file)
        if os.path.isdir(path) and not os.listdir(path):
            os.rmdir(path)
            print("删除了:", path)

上面我们就实现了对D盘所以空文件夹的删除。这里walk的使用后面有机会可以详细介绍。