在本教程中,您将学习如何在 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:\demos\files\
目录中删除 sales_1.txt 文件。现在,此目录包含以下文件:
- sales_1.txt
- sales_2.csv
- profits.txt
- 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:\demos\files\sales_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:\demos\files\sales_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:\demos\files\sales_21.txt'
try:
os.remove(file_path)
except:
print("The system cannot find the file specified")
# your code
使用os.unlink()
方法删除文件
如果您使用的是 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:\demos\files\reports\\"
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:\pynative\old_logs"
os.rmdir(directory)
print("Deleted '%s' directory successfully" % directory)
输出
成功删除 'E:\pynative\old_logs' 目录
利用pathlib.Path.rmdir()
pathlib
模块中的rmdir()
方法也用于移除或删除一个空目录。
- 首先设置目录的路径
- 接下来,调用该
rmdir()
路径上的方法
让我们看一个删除名为“Images”的空目录的示例。
import pathlib
# Deleting an empty folder
empty_dir = r"E:\pynative\old_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:\demos\files\reports"
shutil.rmtree(dir_path, ignore_errors=True)
print("Deleted '%s' directory successfully" % dir_path)
输出
成功删除 'E:\demos\files\reports' 目录
删除非空目录时获取正确的异常消息
为了获得正确的异常消息,我们可以在一个单独的函数中处理它,我们可以将其名称传递给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:\demos\files\reports'
# 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:\demos\files\reports\profits.txt')
# directory
delete(r'E:\demos\files\reports')
删除匹配模式的文件
例如,如果您想批量删除名称包含特定字符串名称的文件。
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:\demos\files\reports\pro*"
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:\demos\files_demos\reports\[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:\demos\files\reports\**\*.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:\demos\files_demos\reports\**\*.*", recursive=True))
输出
删除:E:\demos\files\reports\profits.jpg 删除:E:\demos\files\reports\revenue.jpg
结论
Python 提供了几个用于删除文件和目录的模块。
删除文件:-
- 使用
os.remove()
和os.unlink()
函数删除单个文件 - 如果您使用
pathlib.Path.unlink()
Python 版本 > 3.4 并且应用程序在不同的操作系统上运行,则用于删除文件。
删除目录
- 使用
os.rmdir()
或pathlib.Path.rmdir()
删除空目录 - 使用
shutil.rmtree()
递归删除目录和其中的所有文件。
在删除文件或目录之前要格外小心,因为上述所有功能都会永久删除文件和文件夹。
来源:https://www.02405.com/archives/5919