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

Ответы:

3349

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

RichieHindle
источник
5
os.rmdir () в Windows также удаляет символьную ссылку на каталог, даже если целевой
каталог
8
Если файл не существует, os.remove()выдается исключение, поэтому может потребоваться os.path.isfile()сначала проверить его или добавить в try.
Бен Кроуэлл
2
Я бы хотел, чтобы Path.unlink 1 / был рекурсивным 2 / добавить опцию, чтобы игнорировать FileNotfoundError.
Жером
7
просто для завершения ... os.remove()возникает исключение, если файл не существует FileNotFoundError.
PedroA
Требуется ли os.remove() несколько аргументов для удаления нескольких файлов, или вы вызываете его каждый раз для каждого файла?
user742864
292

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

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

Или

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

Или

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

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

Path.unlink (missing_ok = False)

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

Если missing_ok равно false (по умолчанию), FileNotFoundError вызывается, если путь не существует.
Если значение missing_ok равно true, исключения 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))

РЕСПЕКТИВНЫЙ ВЫХОД

Введите имя файла для удаления: 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))
ананд трипати
источник
13
Обработка исключений рекомендуется при проверке, поскольку файл может быть удален или изменен между двумя строками (TOCTOU: en.wikipedia.org/wiki/Time_of_check_to_time_of_use ) См. Раздел часто задаваемых вопросов
Эрик Араужо
84

использование

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

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

os.remove

а также

os.rmdir

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

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

Вот надежная функция, которая использует 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))
flycee
источник
8
Т.е. 8 строк кода для имитации remove(path);вызова ISO C.
Каз
2
@Kaz согласился раздражать, но удаляет ли сделка с деревьями? :-)
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
6
os.path.islink(file_path): ошибка, должно бытьos.path.islink(path):
Нео Ли
32

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

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

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

Или rmdirспособ удалить пустую папку:

import pathlib
path = pathlib.Path(name_of_folder)
path.rmdir()
MSeifert
источник
2
А как насчет непустого каталога?
Пранас
@Pranasas К сожалению, кажется, что нет ничего (изначально) pathlibтакого, что могло бы справиться с удалением непустых каталогов. Однако вы могли бы использовать shutil.rmtree. Это было упомянуто в нескольких других ответах, поэтому я не включил его.
MSeifert
30

Как удалить файл или папку в 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)

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

Новым в 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

Мы можем использовать globbing для удаления нескольких файлов - сначала давайте создадим несколько файлов для этого:

>>> (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- он только рекурсивно удаляет пустые каталоги, но он может соответствовать вашему варианту использования.

Аарон Холл
источник
rmtree(directory_path)работает в Python 3.6.6, но не в Python 3.5.2 - вам нужно rmtree(str(directory_path)))там.
Стейн
4
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
источник
1
Это удалит только файлы внутри папки и подпапок, оставив структуру папки нетронутой.
Lalithesh
4

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

import os
import shutil

shutil.rmtree(path)

while os.path.exists(path):
  pass

print('done')
m0z4rt
источник
1
shutil.rmtreeне должен быть асинхронным. Тем не менее, может показаться, что на Windows с вирусных сканеров мешают.
Mhsmith
@mhsmith Вирусные сканеры ? Это дикие спекуляции, или вы действительно знаете, что они могут вызвать этот эффект? Как же это работает, если так?
Марк Амери
2

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

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)

Он удаляет каждый пустой родительский каталог с собой до родительского, который имеет некоторый контент

ех. os.removedirs ('abc / xyz / pqr') удалит каталоги по порядку 'abc / xyz / pqr', 'abc / xyz' и 'abc', если они пусты.

Для получения дополнительной информации ознакомьтесь официальный документ: os.unlink, os.remove, os.rmdir, shutil.rmtree,os.removedirs

Сомнат Мулук
источник
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))
Сарендер Редди
источник
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()будут удалять только файлы.

Исаак Тернер
источник
shutil.rmtree()удаляет не только каталог, но и его содержимое.
Тиаго Мартинс Перес 李大仁
-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) 
Miladiouss
источник
3
Подпроцесс - это практика, которой следует избегать
dlewin
3
Я бы не рекомендовал subprocessдля этого. shutil.rmtreeделает rm -rработу просто отлично, с дополнительным бонусом работы на Windows.
Марк Эмери