如何在Python中删除文件或文件夹?

如何删除文件或文件夹?

2979861 次浏览

Python 3.4+#1模块中的#0对象也公开了这些实例方法:

使用

shutil.rmtree(path[, ignore_errors[, onerror]])

(见完整的留档Shutil)和/或

os.remove

os.rmdir

(留档os

这是一个同时使用os.removeshutil.rmtree的健壮函数:

def remove(path):""" param <path> could either be relative or absolute. """if os.path.isfile(path) or os.path.islink(path):os.remove(path)  # remove the fileelif os.path.isdir(path):shutil.rmtree(path)  # remove dir and all containselse:raise ValueError("file {} is not a file or dir.".format(path))

删除文件的Python语法

import osos.remove("/tmp/<file_name>.txt")

import osos.unlink("/tmp/<file_name>.txt")

PathlibLibrary for Python version>=3.4

file_to_rem = pathlib.Path("/tmp/<file_name>.txt")file_to_rem.unlink()

Path.unlink(missing_ok=False)

用于删除文件或符号链接的Unlink方法。

  • 如果missing_ok为false(默认值),则在路径不存在时引发FileNotFoundError。
  • 如果missing_ok为true,FileNotFoundError异常将被忽略(与POSIX rm-f命令的行为相同)。
  • 在3.8版更改:添加了missing_ok参数。

最佳做法

首先,检查文件或文件夹是否存在,然后将其删除。您可以通过两种方式实现这一点:

  1. os.path.isfile("/path/to/file")
  2. 使用exception handling.

示例os.path.isfile

#!/usr/bin/pythonimport os
myfile = "/tmp/foo.txt"# If file exists, delete it.if os.path.isfile(myfile):os.remove(myfile)else:# If it fails, inform the user.print("Error: %s file not found" % myfile)

异常处理

#!/usr/bin/pythonimport os
# Get input.myfile = raw_input("Enter file name to delete: ")
# Try to delete the file.try:os.remove(myfile)except OSError as e:# If it fails, inform the user.print("Error: %s - %s." % (e.filename, e.strerror))

各自输出

Enter file name to delete : demo.txtError: demo.txt - No such file or directory.
Enter file name to delete : rrr.txtError: rrr.txt - Operation not permitted.
Enter file name to delete : foo.txt

删除文件夹的Python语法

shutil.rmtree()

示例shutil.rmtree()

#!/usr/bin/pythonimport osimport sysimport shutil
# Get directory namemydir = raw_input("Enter directory name: ")
# Try to remove the tree; if it fails, throw an error using try...except.try:shutil.rmtree(mydir)except OSError as e:print("Error: %s - %s." % (e.filename, e.strerror))

您可以使用内置的#0模块(需要Python 3.4+,但在PyPI上有旧版本的backport:#0#2)。

要删除文件,有#0方法:

import pathlibpath = pathlib.Path(name_of_file)path.unlink()

或者#0方法删除文件夹:

import pathlibpath = pathlib.Path(name_of_folder)path.rmdir()
import os
folder = '/Path/to/yourDir/'fileList = os.listdir(folder)
for f in fileList:filePath = folder + '/'+f
if os.path.isfile(filePath):os.remove(filePath)
elif os.path.isdir(filePath):newFileList = os.listdir(filePath)for f1 in newFileList:insideFilePath = filePath + '/' + f1
if os.path.isfile(insideFilePath):os.remove(insideFilePath)

如何在Python中删除文件或文件夹?

对于Python 3,要单独删除文件和目录,请分别使用#0#1Path对象方法:

from pathlib import Pathdir_path = Path.home() / 'directory'file_path = dir_path / 'file'
file_path.unlink() # remove file
dir_path.rmdir()   # remove directory

请注意,您还可以使用Path对象的相对路径,并且可以使用Path.cwd检查当前工作目录。

要删除Python 2中的单个文件和目录,请参阅下面标记的部分。

要删除包含内容的目录,请使用#0,并注意这在Python 2和3中可用:

from shutil import rmtree
rmtree(dir_path)

演示

Python 3.4中的新功能是Path对象。

让我们使用一个来创建一个目录和文件来演示使用情况。请注意,我们使用/来连接路径的各个部分,这解决了操作系统之间的问题和在Windows上使用反斜杠的问题(在Windows上你需要像\\一样将反斜杠加倍,或者像r"foo\bar"一样使用原始字符串):

from pathlib import Path
# .home() is new in 3.5, otherwise use os.path.expanduser('~')directory_path = Path.home() / 'directory'directory_path.mkdir()
file_path = directory_path / 'file'file_path.touch()

现在:

>>> file_path.is_file()True

现在让我们删除它们。首先是文件:

>>> file_path.unlink()     # remove file>>> file_path.is_file()False>>> file_path.exists()False

我们可以使用全局删除多个文件-首先让我们为此创建一些文件:

>>> (directory_path / 'foo.my').touch()>>> (directory_path / 'bar.my').touch()

然后只需迭代全局模式:

>>> for each_file_path in directory_path.glob('*.my'):...     print(f'removing {each_file_path}')...     each_file_path.unlink()...removing ~/directory/foo.myremoving ~/directory/bar.my

现在,演示删除目录:

>>> directory_path.rmdir() # remove directory>>> directory_path.is_dir()False>>> directory_path.exists()False

如果我们想删除目录及其中的所有内容怎么办?对于这个用例,使用shutil.rmtree

让我们重新创建我们的目录和文件:

file_path.parent.mkdir()file_path.touch()

并注意rmdir失败,除非它为空,这就是为什么rmtree如此方便:

>>> directory_path.rmdir()Traceback (most recent call last):File "<stdin>", line 1, in <module>File "~/anaconda3/lib/python3.6/pathlib.py", line 1270, in rmdirself._accessor.rmdir(self)File "~/anaconda3/lib/python3.6/pathlib.py", line 387, in wrappedreturn strfunc(str(pathobj), *args)OSError: [Errno 39] Directory not empty: '/home/username/directory'

现在,导入rmtree并将目录传递给函数:

from shutil import rmtreermtree(directory_path)      # remove everything

我们可以看到整个东西都被删除了:

>>> directory_path.exists()False

python2

如果您使用的是Python 2,则有一个返回名为Pathlib2的Pathlib模块,可以使用pip安装:

$ pip install pathlib2

然后您可以将库别名为pathlib

import pathlib2 as pathlib

或者直接导入Path对象(如下所示):

from pathlib2 import Path

如果太多,您可以删除#0或#1的文件

from os import unlink, removefrom os.path import join, expanduser
remove(join(expanduser('~'), 'directory/file'))

unlink(join(expanduser('~'), 'directory/file'))

您可以使用#0删除目录:

from os import rmdir
rmdir(join(expanduser('~'), 'directory'))

请注意,还有一个#0-它只递归删除空目录,但它可能适合您的用例。

shutil.rmtree是异步函数,所以如果你想检查它什么时候完成,你可以使用同时…循环

import osimport shutil
shutil.rmtree(path)
while os.path.exists(path):pass
print('done')

如果您喜欢编写漂亮且可读的代码,我建议使用subprocess

import subprocesssubprocess.Popen("rm -r my_dir", shell=True)

如果你不是软件工程师,那么也许可以考虑使用Jupyter;你可以简单地输入bash命令:

!rm -r my_dir

传统上,您使用shutil

import shutilshutil.rmtree(my_dir)

删除文件:

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

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

这两个函数在语义上是相同的。此函数删除(删除)文件路径。如果path不是文件而是目录,则引发异常。

删除文件夹:

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

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

为了删除整个目录树,可以使用shutil.rmtree()os.rmdir仅在目录为空且存在时有效。

对于向父级递归删除文件夹:

os.removedirs(name)

它删除每个带有self的空父目录,直到父目录有一些内容

例如,如果目录是空的,os.removedirs('abc/xyz/pqr')将按'abc/xyz/pqr'、'abc/xyz'和'abc'的顺序删除目录。

更多信息请查看官方文档:#0#1#2#3#4

删除文件夹中的所有文件

import osimport glob
files = glob.glob(os.path.join('path/to/folder/*'))files = glob.glob(os.path.join('path/to/folder/*.csv')) // It will give all csv files in folderfor file in files:os.remove(file)

删除目录中的所有文件夹

from shutil import rmtreeimport os
// os.path.join()  # current working directory.
for dirct in os.listdir(os.path.join('path/to/folder')):rmtree(os.path.join('path/to/folder',dirct))

为了避免Eric Araujo的评论突出显示的TOCTOU问题,您可以捕获异常以调用正确的方法:

def remove_file_or_dir(path: str) -> None:""" Remove a file or directory """try:shutil.rmtree(path)except NotADirectoryError:os.remove(path)

因为shutil.rmtree()只会删除目录,而os.remove()os.unlink()只会删除文件。

我个人更喜欢使用Pathlib对象——它提供了一种更Pythonic、更不容易出错的方式来与文件系统交互,尤其是在您开发跨平台代码的情况下。

在这种情况下,您可能会使用Pathlib3x-它提供了最新的反向端口(在撰写此答案的日期Python 3.10. a0)Python Pathlib for Python 3.6或更高版本,以及一些附加功能,如“复制”,“复制2”,“复制树”,“rmtree”等…

它还包装了shutil.rmtree

$> python -m pip install pathlib3x$> python>>> import pathlib3x as pathlib
# delete a directory tree>>> my_dir_to_delete=pathlib.Path('c:/temp/some_dir')>>> my_dir_to_delete.rmtree(ignore_errors=True)
# delete a file>>> my_file_to_delete=pathlib.Path('c:/temp/some_file.txt')>>> my_file_to_delete.unlink(missing_ok=True)

您可以在githubpypi上找到它


免责声明:我是Pathlib3x库的作者。

在Python中删除文件或文件夹

在Python中删除文件有多种方法,但最好的方法如下:

  1. os.remove()删除一个文件。
  2. os.unlink()删除一个文件。这是一个Unix名称的删除()方法。
  3. shutil.rmtree()删除目录及其所有内容。
  4. pathlib.Path.unlink()删除单个文件Pathlib模块在Python 3.4及更高版本中可用。

os.remove()

示例1:使用os.remove()方法删除文件的基本示例。

import osos.remove("test_file.txt")print("File removed successfully")

示例2:使用os.path.isfile检查文件是否存在并os.remove删除它

import os#checking if file exist or notif(os.path.isfile("test.txt")):#os.remove() function to remove the fileos.remove("test.txt")#Printing the confirmation message of deletionprint("File Deleted successfully")else:print("File does not exist")#Showing the message instead of throwig an error

示例3:删除具有特定扩展名的所有文件的Python程序

import osfrom os import listdirmy_path = 'C:\Python Pool\Test\'for file_name in listdir(my_path):if file_name.endswith('.txt'):os.remove(my_path + file_name)

示例4:删除文件夹内所有文件的Python程序

要删除特定目录中的所有文件,您只需使用*符号作为模式字符串。#导入操作系统和Glob模块导入操作系统#遍历文件夹中的所有文件并逐个删除它们对于glob.glob中的文件(“pythonpool/*”):os.remove(档案)print(“删除”+str(文件))

os.unlink()

os.unlink()是os.remove()的别名或别名。在Unix操作系统中,删除也称为解除关联。注意:所有功能和语法与os.unlink()和os.remove()相同。它们都用于删除Python文件路径。两者都是Python标准库中os模块中的方法,执行删除功能。

shutil.rmtree()

示例1:使用shutil.rmtree()删除文件的Python程序

import shutilimport os# locationlocation = "E:/Projects/PythonPool/"# directorydir = "Test"# pathpath = os.path.join(location, dir)# removing directoryshutil.rmtree(path)

示例2:使用shutil.rmtree()删除文件的Python程序

import shutilimport oslocation = "E:/Projects/PythonPool/"dir = "Test"path = os.path.join(location, dir)shutil.rmtree(path)

pathlib.Path.rmdir()删除空目录

Pathlib模块提供了不同的方式来与文件交互。Rmdir是路径函数之一,它允许您删除空文件夹。首先,您需要选择目录的Path(),然后调用rmdir()方法将检查文件夹大小。如果它是空的,它会将其删除。

这是删除空文件夹而不必担心丢失实际数据的好方法。

from pathlib import Pathq = Path('foldername')q.rmdir()

这是我删除目录的函数。“路径”需要完整的路径名。

import os
def rm_dir(path):cwd = os.getcwd()if not os.path.exists(os.path.join(cwd, path)):return Falseos.chdir(os.path.join(cwd, path))
for file in os.listdir():print("file = " + file)os.remove(file)print(cwd)os.chdir(cwd)os.rmdir(os.path.join(cwd, path))