如何删除文件或文件夹?

问题:如何删除文件或文件夹?

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

How to delete a file or folder in Python?


回答 0


PathPython 3.4+ pathlib模块中的对象还公开了这些实例方法:


Path objects from the Python 3.4+ pathlib module also expose these instance methods:


回答 1

Python语法删除文件

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

要么

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

要么

适用于Python版本> 3.5的pathlib

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")
    b。采用exception handling.

实例os.path.isfile

#!/usr/bin/python
import os
myfile="/tmp/foo.txt"

## If file exists, delete it ##
if os.path.isfile(myfile):
    os.remove(myfile)
else:    ## Show an error ##
    print("Error: %s file not found" % myfile)

异常处理

#!/usr/bin/python
import 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 failed, report it back to the user ##
    print ("Error: %s - %s." % (e.filename, e.strerror))

预期输出

输入要删除的文件名:demo.txt
错误:demo.txt-没有这样的文件或目录。

输入要删除的文件名:rrr.txt
错误:rrr.txt-不允许操作。

输入要删除的文件名:foo.txt

删除文件夹的Python语法

shutil.rmtree()

范例 shutil.rmtree()

#!/usr/bin/python
import os
import sys
import shutil

# Get directory name
mydir= raw_input("Enter directory name: ")

## Try to remove tree; if failed show an error using try...except on screen
try:
    shutil.rmtree(mydir)
except OSError as e:
    print ("Error: %s - %s." % (e.filename, e.strerror))

Python syntax to delete a file

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

Or

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

Or

pathlib Library for Python version > 3.5

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

Path.unlink(missing_ok=False)

Unlink method used to remove the file or the symbolik link.

If missing_ok is false (the default), FileNotFoundError is raised if the path does not exist.
If missing_ok is true, FileNotFoundError exceptions will be ignored (same behavior as the POSIX rm -f command).
Changed in version 3.8: The missing_ok parameter was added.

Best practice

  1. First, check whether the file or folder exists or not then only delete that file. This can be achieved in two ways :
    a. os.path.isfile("/path/to/file")
    b. Use exception handling.

EXAMPLE for os.path.isfile

#!/usr/bin/python
import os
myfile="/tmp/foo.txt"

## If file exists, delete it ##
if os.path.isfile(myfile):
    os.remove(myfile)
else:    ## Show an error ##
    print("Error: %s file not found" % myfile)

Exception Handling

#!/usr/bin/python
import 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 failed, report it back to the user ##
    print ("Error: %s - %s." % (e.filename, e.strerror))

RESPECTIVE OUTPUT

Enter file name to delete : demo.txt
Error: demo.txt - No such file or directory.

Enter file name to delete : rrr.txt
Error: rrr.txt - Operation not permitted.

Enter file name to delete : foo.txt

Python syntax to delete a folder

shutil.rmtree()

Example for shutil.rmtree()

#!/usr/bin/python
import os
import sys
import shutil

# Get directory name
mydir= raw_input("Enter directory name: ")

## Try to remove tree; if failed show an error using try...except on screen
try:
    shutil.rmtree(mydir)
except OSError as e:
    print ("Error: %s - %s." % (e.filename, e.strerror))

回答 2

采用

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

(请参阅关于shutil的完整文档)和/或

os.remove

os.rmdir

(关于os的完整文档。)

Use

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

(See complete documentation on shutil) and/or

os.remove

and

os.rmdir

(Complete documentation on os.)


回答 3

这是同时使用os.remove和的强大功能shutil.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 file
    elif os.path.isdir(path):
        shutil.rmtree(path)  # remove dir and all contains
    else:
        raise ValueError("file {} is not a file or dir.".format(path))

Here is a robust function that uses both os.remove and shutil.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 file
    elif os.path.isdir(path):
        shutil.rmtree(path)  # remove dir and all contains
    else:
        raise ValueError("file {} is not a file or dir.".format(path))

回答 4

您可以使用内置的pathlib模块(需要Python 3.4+,但也有旧版本PyPI上的反向移植:pathlibpathlib2)。

要删除文件,可以使用以下unlink方法:

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

rmdir删除文件夹的方法:

import pathlib
path = pathlib.Path(name_of_folder)
path.rmdir()

You can use the built-in pathlib module (requires Python 3.4+, but there are backports for older versions on PyPI: pathlib, pathlib2).

To remove a file there is the unlink method:

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

Or the rmdir method to remove an empty folder:

import pathlib
path = pathlib.Path(name_of_folder)
path.rmdir()

回答 5

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

对于Python 3,要分别删除文件和目录,请分别使用unlink和对象方法:rmdir Path

from pathlib import Path
dir_path = Path.home() / 'directory' 
file_path = dir_path / 'file'

file_path.unlink() # remove file

dir_path.rmdir()   # remove directory

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

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

要删除包含目录的目录,请使用shutil.rmtree,请注意,该目录在Python 2和3中可用:

from shutil import rmtree

rmtree(dir_path)

示范

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

让我们用一个目录和文件来演示用法。请注意,我们使用/来连接路径的各个部分,这解决了操作系统之间的问题以及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.my
removing ~/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 rmdir
    self._accessor.rmdir(self)
  File "~/anaconda3/lib/python3.6/pathlib.py", line 387, in wrapped
    return strfunc(str(pathobj), *args)
OSError: [Errno 39] Directory not empty: '/home/username/directory'

现在,导入rmtree并将目录传递给该功能:

from shutil import rmtree
rmtree(directory_path)      # remove everything 

我们可以看到整个内容已被删除:

>>> directory_path.exists()
False

Python 2

如果您使用的是Python 2,则有一个名为pathlib2的pathlib模块的反向端口,可以使用pip进行安装:

$ pip install pathlib2

然后您可以将库别名为 pathlib

import pathlib2 as pathlib

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

from pathlib2 import Path

如果太多,您可以使用删除文件os.removeos.unlink

from os import unlink, remove
from os.path import join, expanduser

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

要么

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

您可以使用以下命令删除目录os.rmdir

from os import rmdir

rmdir(join(expanduser('~'), 'directory'))

请注意,还有一个os.removedirs-它仅以递归方式删除空目录,但它可能适合您的用例。

How do I delete a file or folder in Python?

For Python 3, to remove the file and directory individually, use the unlink and rmdir Path object methods respectively:

from pathlib import Path
dir_path = Path.home() / 'directory' 
file_path = dir_path / 'file'

file_path.unlink() # remove file

dir_path.rmdir()   # remove directory

Note that you can also use relative paths with Path objects, and you can check your current working directory with Path.cwd.

For removing individual files and directories in Python 2, see the section so labeled below.

To remove a directory with contents, use shutil.rmtree, and note that this is available in Python 2 and 3:

from shutil import rmtree

rmtree(dir_path)

Demonstration

New in Python 3.4 is the Path object.

Let’s use one to create a directory and file to demonstrate usage. Note that we use the / to join the parts of the path, this works around issues between operating systems and issues from using backslashes on Windows (where you’d need to either double up your backslashes like \\ or use raw strings, like 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()

and now:

>>> file_path.is_file()
True

Now let’s delete them. First the file:

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

We can use globbing to remove multiple files – first let’s create a few files for this:

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

Then just iterate over the glob pattern:

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

Now, demonstrating removing the directory:

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

What if we want to remove a directory and everything in it? For this use-case, use shutil.rmtree

Let’s recreate our directory and file:

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

and note that rmdir fails unless it’s empty, which is why rmtree is so convenient:

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

Now, import rmtree and pass the directory to the funtion:

from shutil import rmtree
rmtree(directory_path)      # remove everything 

and we can see the whole thing has been removed:

>>> directory_path.exists()
False

Python 2

If you’re on Python 2, there’s a backport of the pathlib module called pathlib2, which can be installed with pip:

$ pip install pathlib2

And then you can alias the library to pathlib

import pathlib2 as pathlib

Or just directly import the Path object (as demonstrated here):

from pathlib2 import Path

If that’s too much, you can remove files with os.remove or os.unlink

from os import unlink, remove
from os.path import join, expanduser

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

or

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

and you can remove directories with os.rmdir:

from os import rmdir

rmdir(join(expanduser('~'), 'directory'))

Note that there is also a os.removedirs – it only removes empty directories recursively, but it may suit your use-case.


回答 6

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)
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)

回答 7

shutil.rmtree是异步函数,因此,如果要检查它是否完成,可以使用while … loop

import os
import shutil

shutil.rmtree(path)

while os.path.exists(path):
  pass

print('done')

shutil.rmtree is the asynchronous function, so if you want to check when it complete, you can use while…loop

import os
import shutil

shutil.rmtree(path)

while os.path.exists(path):
  pass

print('done')

回答 8

删除文件:

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删除目录。

欲了解更多信息检查官方文档:os.unlinkos.removeos.rmdirshutil.rmtreeos.removedirs

For deleting files:

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

or

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

Both functions are semantically same. This functions removes (deletes) the file path. If path is not a file and it is directory, then exception is raised.

For deleting folders:

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

or

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

In order to remove whole directory trees, shutil.rmtree() can be used. os.rmdir only works when the directory is empty and exists.

For deleting folders recursively towards parent:

os.removedirs(name)

It remove every empty parent directory with self until parent which has some content

ex. os.removedirs(‘abc/xyz/pqr’) will remove the directories by order ‘abc/xyz/pqr’, ‘abc/xyz’ and ‘abc’ if they are empty.

For more info check official doc: os.unlink , os.remove, os.rmdir , shutil.rmtree, os.removedirs


回答 9

删除文件夹中的所有文件

import os
import 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 folder
for file in files:
    os.remove(file)

删除目录中的所有文件夹

from shutil import rmtree
import 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))

To remove all files in folder

import os
import 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 folder
for file in files:
    os.remove(file)

To remove all folders in a directory

from shutil import rmtree
import 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))

回答 10

为了避免ÉricAraujo 的注释突出显示的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()仅将删除文件。

To avoid the TOCTOU issue highlighted by Éric Araujo’s comment, you can catch an exception to call the correct method:

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

Since shutil.rmtree() will only remove directories and os.remove() or os.unlink() will only remove files.


回答 11

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

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

而且,如果您不是软件工程师,那么可以考虑使用Jupyter。您可以简单地输入bash命令:

!rm -r my_dir

传统上,您使用shutil

import shutil
shutil.rmtree(my_dir) 

I recommend using subprocess if writing a beautiful and readable code is your cup of tea:

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

And if you are not a software engineer, then maybe consider using Jupyter; you can simply type bash commands:

!rm -r my_dir

Traditionally, you use shutil:

import shutil
shutil.rmtree(my_dir)