Как удалить файл или папку в 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
Мы можем использовать глобирование для удаления нескольких файлов - сначала давайте создадим несколько файлов для этого:
>>> (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/excelsiora/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
- он только рекурсивно удаляет пустые каталоги, но может подходить для вашего варианта использования.