Как удалить файл или папку в Python?

avatar
Zygimantas
9 августа 2011 в 13:05
2489360
15
2684

Как удалить файл или папку в Python?

Источник

Ответы (15)

avatar
RichieHindle
9 августа 2011 в 13:07
4072

Path объекты из модуля Python 3.4+ pathlib также предоставляют следующие методы экземпляра:

Lu55
18 декабря 2015 в 17:23
7

os.rmdir () в Windows также удаляет символическую ссылку на каталог, даже если целевой каталог не пуст.

Ben Crowell
4 июля 2018 в 00:00
57

Если файл не существует, os.remove() генерирует исключение, поэтому может потребоваться сначала проверить os.path.isfile() или заключить в try.

Jérôme
10 июля 2018 в 13:52
2

Я хочу, чтобы Path.unlink 1 / был рекурсивным 2 / добавить возможность игнорировать FileNotfoundError.

PedroA
4 февраля 2020 в 17:52
16

просто для завершения ... исключение, созданное os.remove(), если файл не существует, - FileNotFoundError.

user742864
9 мая 2020 в 23:57
0

Принимает ли os.remove() несколько аргументов для удаления нескольких файлов, или вы вызываете его каждый раз для каждого файла?

AO_
14 августа 2020 в 06:35
0

Это уже нанесено на карту здесь: ao.gl/how-to-delete-a-file-in-python

Felix
8 декабря 2020 в 21:04
6

@ Jérôme Я думаю, что missing_ok=True, добавлено в 3.8, решает эту проблему!

Petr Vepřek
11 февраля 2021 в 15:03
0

os.removedirs удаляет ветку пустых каталогов (т.е. сначала удаляет пустой листовой каталог, а затем продолжает вверх по иерархии ветвей, удаляя все пустые каталоги).

avatar
Daring_T
23 декабря 2021 в 02:13
3

Это моя функция для удаления каталогов. Для «пути» требуется полное имя пути.

import os

def rm_dir(path):
    cwd = os.getcwd()
    if not os.path.exists(os.path.join(cwd, path)):
        return False
    os.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))
avatar
DS_ShraShetty
23 ноября 2021 в 04:58
22

Удаление файла или папки в Python

Существует несколько способов удаления файла в Python, но лучшие из них следующие:

  1. os.remove() удаляет файл.
  2. os.unlink() удаляет файл. это Unix-имя метода remove().
  3. shutil.rmtree() удаляет каталог и все его содержимое.
  4. pathlib.Path.unlink() удаляет один файл. Модуль pathlib доступен в Python 3.4 и выше.

os.remove()

Пример 1. Базовый пример удаления файла с помощью метода os.remove().

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

Пример 2. Проверка существования файла с помощью os.path.isfile и его удаление с помощью os.remove

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

Пример 3: Программа Python для удаления всех файлов с определенным расширением

import os 
from os import listdir
my_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 для удаления всех файлов внутри папки

Чтобы удалить все файлы внутри определенного каталога, вам просто нужно использовать символ * в качестве строки шаблона. #Импорт модулей os и glob импорт ос, глоб #Loop Через папку проецирует все файлы и удаляет их один за другим для файла в glob.glob("pythonpool/*"): os.remove(файл) print("Удалено " + str(файл))

os.unlink()

os.unlink() — это псевдоним или другое имя os.remove(). Как и в ОС Unix, удаление также известно как отвязка. Примечание. Все функции и синтаксис аналогичны os.unlink() и os.remove(). Оба они используются для удаления пути к файлу Python. Оба являются методами модуля os в стандартных библиотеках Python, которые выполняют функцию удаления.

shutil.rmtree()

Пример 1: Программа на Python для удаления файла с помощью Shutil.rmtree()

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

Пример 2: Программа на Python для удаления файла с помощью Shutil.rmtree()

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

pathlib.Path.rmdir() для удаления пустого каталога

Модуль Pathlib предоставляет различные способы взаимодействия с вашими файлами. Rmdir — это одна из функций пути, которая позволяет вам удалить пустую папку. Во-первых, вам нужно выбрать Path() для каталога, а затем вызов метода rmdir() проверит размер папки. Если он пуст, он удалит его.

Это хороший способ удалить пустые папки, не опасаясь потери фактических данных.

from pathlib import Path
q = Path('foldername')
q.rmdir()
avatar
bitranox
5 июля 2020 в 13:57
0

Лично я предпочитаю работать с объектами pathlib - он предлагает более питонический и менее подверженный ошибкам способ взаимодействия с файловой системой, особенно если вы разрабатываете кросс-платформенный код.

В этом случае вы можете использовать pathlib3x - он предлагает резервную копию последней (на момент написания этого ответа Python 3.10.a0) библиотеки путей Python для Python 3.6 или новее, а также несколько дополнительных функций, таких как «копировать», «copy2», «copytree», «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)

вы можете найти его на github или PyPi


Отказ от ответственности: я являюсь автором библиотеки pathlib3x.

avatar
Isaac Turner
8 февраля 2020 в 13:10
0

Чтобы избежать проблемы 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() удаляет только файлы.

Tiago Martins Peres
30 апреля 2020 в 08:22
0

shutil.rmtree() удаляет не только каталог, но и его содержимое.

avatar
Sarender Reddy
12 декабря 2019 в 12:32
1

Чтобы удалить все файлы в папке

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))
avatar
Somnath Muluk
1 августа 2019 в 05:10
5

Для удаления файлов:

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

или

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

Обе функции семантически одинаковы. Эта функция удаляет (удаляет) путь к файлу. Если путь не является файлом, а является каталогом, возникает исключение.

Для удаления папок:

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.unlink, os.remove, , <56849867567567> os.removedirs

avatar
Miladiouss
30 мая 2018 в 23:11
-1

Я рекомендую использовать subprocess, если писать красивый и читаемый код - ваша чашка чая:

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

А если вы не инженер-программист, то, возможно, подумайте об использовании Jupyter; вы можете просто ввести команды bash:

!rm -r my_dir

Традиционно используется shutil:

import shutil
shutil.rmtree(my_dir) 
dlewin
29 января 2019 в 15:01
3

Подпроцесс - это практика, которую следует избегать

Mark Amery
4 июля 2019 в 23:04
3

Я бы не рекомендовал для этого subprocess. shutil.rmtree отлично справляется с работой rm -r, с дополнительным бонусом работы в Windows.

avatar
m0z4rt
23 марта 2018 в 17:08
6

shutil.rmtree - асинхронная функция, поэтому, если вы хотите проверить, когда он завершится, вы можете использовать цикл while ...

import os
import shutil

shutil.rmtree(path)

while os.path.exists(path):
  pass

print('done')
mhsmith
2 августа 2018 в 21:04
1

shutil.rmtree не должен быть асинхронным. Однако может показаться, что в Windows вмешиваются антивирусные сканеры.

Mark Amery
4 июля 2019 в 23:02
0

@mhsmith Сканеры вирусов ? Это безумные предположения, или вы действительно знаете, что они могут вызвать такой эффект? Как, черт возьми, это работает, если так?

avatar
Aaron Hall
12 февраля 2018 в 01:44
36

Как удалить файл или папку в Python?

Для Python 3, чтобы удалить файл и каталог по отдельности, используйте методы объекта unlink и rmdir Path соответственно: <895198911

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)

Демонстрация

Новым в Python 3.4 является объект Path.

Давайте воспользуемся одним из них для создания каталога и файла для демонстрации использования. Обратите внимание, что мы используем / для соединения частей пути, это позволяет решить проблемы между операционными системами и проблемы, связанные с использованием обратной косой черты в 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, существует бэкпорт модуля pathlib с именем pathlib2, который можно установить с помощью pip:

$ pip install pathlib2

Затем вы можете присвоить библиотеке псевдоним pathlib

import pathlib2 as pathlib

Или просто напрямую импортируйте объект Path (как показано здесь):

from pathlib2 import Path

Если это слишком много, вы можете удалить файлы с помощью os.remove или os.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 - он рекурсивно удаляет только пустые каталоги, но это может соответствовать вашему варианту использования.

Stein
22 августа 2018 в 08:48
0

rmtree(directory_path) работает в python 3.6.6, но не в python 3.5.2 - вам нужен rmtree(str(directory_path))) там.

avatar
Lalithesh
25 октября 2017 в 12:49
5
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)
Lalithesh
28 февраля 2018 в 11:30
1

Это приведет к удалению только файлов внутри папки и подпапок, оставляя структуру папок нетронутой.

avatar
MSeifert
6 августа 2017 в 20:10
41

Вы можете использовать встроенный модуль pathlib (требуется Python 3.4+, но есть резервные порты для старых версий на PyPI: pathlib <5451416749748> <5451416749748> pathlib2>).

Для удаления файла существует метод unlink:

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

Или метод rmdir для удаления пустой папки :

import pathlib
path = pathlib.Path(name_of_folder)
path.rmdir()
Pranasas
11 июля 2018 в 08:43
6

А как насчет непустого каталога?

MSeifert
11 июля 2018 в 08:46
1

@Pranasas К сожалению, кажется, что в pathlib нет ничего (изначально), что могло бы обрабатывать удаление непустых каталогов. Однако вы можете использовать shutil.rmtree. Об этом упоминалось в нескольких других ответах, поэтому я не включил его.

avatar
Anand Tripathi
7 марта 2017 в 06:37
472

Синтаксис Python для удаления файла

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

Или

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

Или

pathlib Библиотека для версии Python> = 3.4

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

Path.unlink (missing_ok = False)

Метод отмены связи, используемый для удаления файла или символьной ссылки.

Если missing_ok имеет значение false (по умолчанию), FileNotFoundError возникает, если путь не существует.
Если значение missing_ok истинно, исключения FileNotFoundError будут игнорироваться (такое же поведение, как у команды POSIX rm -f).
Изменено в версии 3.8: добавлен параметр missing_ok.

Лучшие практики

  1. Сначала проверьте, существует ли файл или папка, а затем удалите только этот файл. Этого можно добиться двумя способами:
    а. os.path.isfile("/path/to/file")
    б. Используйте 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))

ОТВЕТСТВЕННЫЙ ВЫХОД

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 для удаления папки

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))
Éric Araujo
22 мая 2019 в 21:37
33

Обработка исключений рекомендуется вместо проверки, поскольку файл может быть удален или изменен между двумя строками (TOCTOU: en.wikipedia.org/wiki/Time_of_check_to_time_of_use) См. FAQ по Python docs.python.org/3 /glossary.html#term-eafp

jaaq
2 ноября 2020 в 13:07
2

Также EAFP предпочтительнее LBYL в Python.

Welgriv
5 июля 2021 в 07:46
0

какой смысл ловить исключение в самом последнем примере?

avatar
flycee
22 января 2017 в 09:40
61

Вот надежная функция, которая использует как 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))
Kaz
21 апреля 2017 в 23:22
11

Т.е. 8 строк кода для имитации вызова ISO C remove(path);.

Ciro Santilli 新疆再教育营六四事件法轮功郝海东
8 сентября 2018 в 22:37
2

@Kaz согласился, что раздражает, но убирает ли дело с деревьями? :-)

Neo li
23 января 2020 в 09:17
6

os.path.islink(file_path): ошибка, должна быть os.path.islink(path):

avatar
Mihai Maruseac
9 августа 2011 в 13:09
103

Используйте

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

(См. Полную документацию по shutil) и / или

os.remove

и

os.rmdir

(Полная документация по ОС.)

Paebbels
25 апреля 2016 в 19:38
8

Пожалуйста, добавьте интерфейс pathlib (новый, начиная с Python 3.4) в свой список.