在本教程中,您将学习如何在 Python 中删除文件或目录。

阅读本教程后,您将学习:–

  • 使用 os 模块和 pathlib 模块删除文件
  • 从目录中删除文件
  • 删除与模式匹配的文件(通配符)
  • 删除空目录
  • 删除目录的内容(所有文件和子目录)

有时我们需要从不再需要的目录中删除文件。例如,您将每月库存数据存储在一个文件中。您可能希望在每月创建新数据文件之前删除所有现有数据文件。此外,一段时间后,应用程序需要删除其旧的日志文件。

在本教程中,我们将使用以下Python 函数来删除文件和文件夹

函数 功能
os.remove(‘file_path’) 删除指定的文件。
os.unlink(‘file_path’) 删除指定的文件。常用于Linux系统。
pathlib.Path(“file_path”).unlink() 删除上述路径中的文件或符号链接
os.rmdir(’empty_dir_path’) 删除空文件夹。
pathlib.Path(empty_dir_path).rmdir() 取消链接并删除空文件夹。
shutil.rmtree(‘dir_path’) 删除目录和其中包含的文件。
删除文件和文件夹的函数

如何在 Python 中删除文件

Python 为文件处理提供了强大的支持。我们可以使用不同的方法删除文件,最常用的一种是os.remove()方法。

示例:在 Python 中删除文件

以下代码说明了如何删除名为“sales_1.txt”的文件。

假设我们要从E:demosfiles目录中删除 sales_1.txt 文件。现在,此目录包含以下文件:

  1. sales_1.txt
  2. sales_2.csv
  3. profits.txt
  4. revenue.txt

删除具有相对路径的文件

import os

# removing a file with relative path
os.remove("sales_1.txt")

删除带有绝对路径的文件

import os

# remove file with absolute path
os.remove(r"E:demosfilessales_2.txt")

我们的代码删除了两个文件。这是我们目录中剩余文件的列表:

  • profits.txt
  • revenue.txt
删除文件之前
删除文件之前
删除文件后
删除文件后

了解os.remove()方法

语法

os.remove(path, *, dir_fd = None)

将文件路径传递os.remove('file_path')函数以从磁盘中删除文件

以下是我们需要传递的参数。

  • path –文件对象的相对或绝对路径,通常为字符串格式。
  • dir_fd – 表示文件位置的目录。默认值为 none,如果是绝对路径,则忽略此值。

如果传递的文件路径是目录,则会引发OSError错误。

删除前检查文件是否存在

如果在路径中找不到文件,则会引发FileNotFoundError错误,因此建议在删除文件之前检查文件是否存在。

这可以通过两种方式实现:

  • 使用os.path.exists("file path")检查文件是否存在。
  • 使用异常处理。

示例1:

import os

file_path = r'E:demosfilessales_2.txt'
if os.path.exists(file_path):
    os.remove(file_path)
else:
    print("The system cannot find the file specified")

注意:建议在文件检查之前进行异常处理,因为文件可能会在两者之间被删除或更改。这是删除可能存在或不存在的文件的 Pythonic 方式。

示例 2:异常处理

import os

file_path = r'E:demosfilessales_21.txt'
try:
    os.remove(file_path)
except:
    print("The system cannot find the file specified")
    # your code

如果您使用的是 UNIX 操作系统,请使用OS模块中提供的unlink()方法,该方法类似于 remove(),只是在UNIX 环境中更合适。

os.unlink(path, *, dir_fd=None)
  • path – 文件对象的相对或绝对路径,通常为字符串格式。
  • dir_fd – 表示文件位置的目录。默认值为 none,如果是绝对路径,则忽略此值。

让我们看看删除当前执行路径中的文件“profits.txt”的代码。

import os

os.unlink('profits.txt')

用于删除文件的 Pathlib 模块

pathlib模块提供了代表文件系统路径的类,这些类具有适用于不同操作系统的语义。因此,每当我们需要在多个环境中处理文件时,我们都可以使用 pathlib 模块

pathlib 模块是在 Python 3.4 中添加的。pathlib 模块中的pathlib.path.unlink()方法用于删除提到的路径中的文件。

此外,它需要一个额外的参数,即missing_ok=False. 如果参数设置为 True,则 pathlib 模块将忽略 File Not Found Error。否则,如果路径不存在,FileNotFoundError则会引发 。

让我们看看删除当前执行路径中存在的文件“profits.txt”的代码。

  • 导入 pathlib 模块
  • 使用pathlib.Path()方法设置文件路径
  • 接下来,要删除文件,请在给定文件路径上调用 unlink() 方法。
import pathlib

# Setting the path for the file
file = pathlib.Path("profits.txt")
# Calling the unlink method on the path
file.unlink()

从目录中删除所有文件

有时我们想从目录中删除所有文件而不删除目录。按照以下步骤从目录中删除所有文件。

  • 使用os.listdir(path)函数获取文件夹中的文件列表。它返回一个列表,其中包含给定目录中的文件和文件夹的名称。
  • 使用for 循环遍历列表以逐个访问每个文件
  • 使用os.remove()删除每个文件

示例

import os

path = r"E:demosfilesreports\"
for file_name in os.listdir(path):
    # construct full file path
    file = path + file_name
    if os.path.isfile(file):
        print('Deleting file:', file)
        os.remove(file)

使用 rmdir() 删除空目录(文件夹)

虽然一般情况下目录总是有一些文件,但有时我们也会有不再需要的空文件夹或目录。我们可以使用os 模块或 pathlib 模块中的 rmdir() 方法删除它们。

使用os.rmdir()方法

为了删除空文件夹,我们可以使用 os 模块中的 rmdir() 函数。

os.rmdir(path, *, dir_fd = None)

以下是我们需要传递给该方法的参数。

  • path– 目录对象的相对或绝对路径,通常为字符串格式。
  • dir_fd– 文件目录。默认值为none,在绝对路径的情况下该值被忽略。

注意:如果目录不为空,OSError则将被抛出。

import os

# Deleting an empty folder
directory = r"E:pynativeold_logs"
os.rmdir(directory)
print("Deleted '%s' directory successfully" % directory)

输出

成功删除 'E:pynativeold_logs' 目录

利用pathlib.Path.rmdir()

pathlib 模块中的rmdir()方法也用于移除或删除一个空目录。

  • 首先设置目录的路径
  • 接下来,调用该rmdir()路径上的方法

让我们看一个删除名为“Images”的空目录的示例。

import pathlib

# Deleting an empty folder
empty_dir = r"E:pynativeold_images"
path = pathlib.Path(empty_dir)
path.rmdir()
print("Deleted '%s' directory successfully" % empty_dir)

使用 shutil 删除非空目录

有时我们需要删除一个文件夹以及其中包含的所有文件。使用shutil 模块rmtree()的方法删除一个目录和其中的所有文件。

Python shutil 模块有助于在文件或文件集合中执行高级操作,例如复制或删除内容。

shutil.rmtree(path, ignore_errors=False, onerror=None)

参数

  • path– 要删除的目录。指向目录的符号链接是不可接受的。
  • ignore_errors– 如果此标志设置为 true,则由于删除失败而导致的错误将被忽略。如果设置为 true,则错误应由传入一个错误属性的函数处理。

注意 rmtree()函数递归删除指定文件夹及其所有子文件夹。

考虑以下示例以删除包含图像文件和 pdf 文件的文件夹“reports”。

import shutil

# Deleting an non-empty folder
dir_path = r"E:demosfilesreports"
shutil.rmtree(dir_path, ignore_errors=True)
print("Deleted '%s' directory successfully" % dir_path)

输出

成功删除 'E:demosfilesreports' 目录

删除非空目录时获取正确的异常消息

为了获得正确的异常消息,我们可以在一个单独的函数中处理它,我们可以将其名称传递给oneerror参数,或者在 try-except 块中捕获它。

import shutil

# Function for Exception Handling
def handler(func, path, exc_info):
    print("We got the following exception")
    print(exc_info)

# location
dir_path = r'E:demosfilesreports'
# removing directory
shutil.rmtree(dir_path, ignore_errors=False, onerror=handler)

最终代码:删除文件或目录

import os
import shutil

def delete(path):
    """path could either be relative or absolute. """
    # check if file or directory exists
    if os.path.isfile(path) or os.path.islink(path):
        # remove file
        os.remove(path)
    elif os.path.isdir(path):
        # remove directory and all its content
        shutil.rmtree(path)
    else:
        raise ValueError("Path {} is not a file or dir.".format(path))

# file
delete(r'E:demosfilesreportsprofits.txt')
# directory
delete(r'E:demosfilesreports')

删除匹配模式的文件

例如,如果您想批量删除名称包含特定字符串名称的文件。

Python glob模块是 Python 标准库的一部分,用于 查找名称遵循特定模式的文件和文件夹

glob.glob(pathname, *, recursive=False)

glob.glob()方法返回与参数中指定的模式匹配的文件或文件夹列表pathname

此函数有两个参数,即路径名和递归标志(如果设置为 True 它将递归搜索所有子文件夹中的文件)

我们可以使用通配符进行模式匹配,以下是模式匹配中使用的通配符列表。

  • 星号 ( *):匹配零个或多个字符
  • 问号 ( ?) 只匹配一个字符
  • 我们可以在 [].

示例:删除具有特定扩展名的文件

在某些情况下,我们必须删除所有具有特定扩展名的文件。

  • 使用glob()方法查找文件夹中的所有文本文件
  • 使用for 循环遍历所有文件
  • 在每次迭代中,删除单个文件。

让我们看几个例子来了解如何使用它来删除与特定模式匹配的文件。

例子

import glob
import os

# Search files with .txt extension in current directory
pattern = "*.txt"
files = glob.glob(pattern)

# deleting the files with txt extension
for file in files:
    os.remove(file)

删除名称以特定字符串开头的文件

import glob
import os

# Delete file whose name starts with string 'pro'
pattern = r"E:demosfilesreportspro*"
for item in glob.iglob(pattern, recursive=True):
    os.remove(item)

删除名称中包含特定字母的文件

我们可以通过将它们括在方括号 ( [])中来提供一系列字符作为搜索字符串 。

以下示例将显示如何删除名称包含 ag 之间的字符的文件。

import glob
import os

# search files like abc.txt, abd.txt
pattern = r"E:demosfiles_demosreports[a-g]*.txt"
for item in glob.iglob(pattern, recursive=True):
    os.remove(item)

从所有子文件夹中删除匹配模式的文件

虽然 glob() 函数在文件夹中查找文件,但可以使用iglob()类似于 glob() 函数的函数在子文件夹中搜索文件。

iglob()函数返回迭代器选项,其中包含与文件夹及其子文件夹中的模式匹配的文件列表。

当我们在子目录中搜索文件时,我们需要将递归标志设置为 True 。在根文件夹名称之后,我们需要**在子目录中进行搜索。

import glob
import os

# Searching pattern inside folders and sub folders recursively
# search all jpg files
pattern = r"E:demosfilesreports***.jpg"
for item in glob.iglob(pattern, recursive=True):
    # delete file
    print("Deleting:", item)
    os.remove(item)

# Uncomment the below code check the remaining files
# print(glob.glob(r"E:demosfiles_demosreports***.*", recursive=True))

输出

删除:E:demosfilesreportsprofits.jpg
删除:E:demosfilesreportsrevenue.jpg

结论

Python 提供了几个用于删除文件和目录的模块。

删除文件:-

  • 使用os.remove()os.unlink()函数删除单个文件
  • 如果您使用pathlib.Path.unlink()Python 版本 > 3.4 并且应用程序在不同的操作系统上运行,则用于删除文件。

删除目录

  • 使用os.rmdir()pathlib.Path.rmdir()删除空目录
  • 使用shutil.rmtree()递归删除目录和其中的所有文件。

在删除文件或目录之前要格外小心,因为上述所有功能都会永久删除文件和文件夹。