Введение
В Python есть несколько встроенных модулей, позволяющих удалять файлы и каталоги.
В этом руководстве объясняется, как удалять файлы и каталоги с помощью функций модуля os
, pathlib
и shutil
.
Удалить файлы
В Python вы можете использовать os.remove()
, os.unlink()
, pathlib.Path.unlink()
для удаления одного файла.
Модуль os
предоставляет портативный способ взаимодействия с операционной системой. Модуль доступен для Python 2 и 3.
Чтобы удалить один файл с помощью os.remove()
, передайте путь к файлу в качестве аргумента:
import os
file_path = '/tmp/file.txt'
os.remove(file_path)
Функции os.remove()
и os.unlink()
семантически идентичны:
import os
file_path = '/tmp/file.txt'
os.unlink(file_path)
Если указанный файл не существует, возникает FileNotFoundError
. Обе функции os.remove()
и os.unlink()
могут удалять только файлы, но не каталоги. Если указанный путь указывает на каталог, они сгенерируют IsADirectoryError
.
Для удаления файла требуется разрешение на запись и выполнение в каталоге, содержащем файл. В противном случае вы получите ошибку PermissionError
.
Чтобы избежать ошибок при удалении файлов, вы можете использовать обработку исключений, чтобы перехватить исключение и отправить исправленное сообщение об ошибке:
import os
file_path = '/tmp/file.txt'
try:
os.remove(file_path)
except OSError as e:
print("Error: %s: %s" % (file_path, e.strerror))
Модуль pathlib
доступен в Python 3.4 и более поздних версиях. Если вы хотите использовать этот модуль в Python 2, вы можете установить его с помощью pip. pathlib
предоставляет объектно-ориентированный интерфейс для работы с путями файловой системы для разных операционных систем.
Чтобы удалить файл с помощью модуля pathlib
, создайте объект Path
, указывающий на файл, и вызовите метод unlink()
на объекте:
from pathlib import Path
file_path = Path('/tmp/file.txt')
try:
file_path.unlink()
except OSError as e:
print("Error: %s: %s" % (file_path, e.strerror))
pathlib.Path.unlink()
, os.remove()
и os.unlink()
также могут использоваться для удаления символической ссылки.
Соответствие модели
Вы можете использовать модуль glob для сопоставления нескольких файлов на основе шаблона. Например, чтобы удалить все файлы .txt
в каталоге /tmp
, вы должны использовать что-то вроде этого:
import os
import glob
files = glob.glob('/tmp/*.txt')
for f in files:
try:
f.unlink()
except OSError as e:
print("Error: %s: %s" % (f, e.strerror))
Чтобы рекурсивно удалить все файлы .txt
в каталоге /tmp
и всех подкаталогах ниже него, передайте аргумент recursive=True
в функцию glob()
и используйте шаблон ``**``:
import os
import glob
files = glob.glob('/tmp/**/*.txt', recursive=True)
for f in files:
try:
os.remove(f)
except OSError as e:
print("Error: %s: %s" % (f, e.strerror))
Модуль pathlib
включает две функции glob()
и rglob()
для сопоставления файлов в заданном каталоге. glob()
соответствует файлам только в каталоге верхнего уровня. rglob()
рекурсивно находит все файлы в каталоге и во всех подкаталогах. Следующий пример кода удаляет все файлы .txt
в каталоге /tmp
:
from pathlib import Path
for f in Path('/tmp').glob('*.txt'):
try:
f.unlink()
except OSError as e:
print("Error: %s: %s" % (f, e.strerror))
Удалить каталоги (папки)
В Python вы можете использовать os.rmdir()
и pathlib.Path.rmdir()
для удаления пустого каталога и shutil.rmtree()
для удаления непустого каталога.
В следующем примере показано, как удалить пустой каталог:
import os
dir_path = '/tmp/img'
try:
os.rmdir(dir_path)
except OSError as e:
print("Error: %s: %s" % (dir_path, e.strerror))
Кроме того, вы можете удалить каталоги с помощью модуля pathlib
:
from pathlib import Path
dir_path = Path('/tmp/img')
try:
dir_path.rmdir()
except OSError as e:
print("Error: %s: %s" % (dir_path, e.strerror))
Модуль shutil
позволяет выполнять многочисленные высокоуровневые операции с файлами и каталогами.
С помощью функции shutil.rmtree()
можно удалить определенный каталог, включая его содержимое:
import shutil
dir_path = '/tmp/img'
try:
shutil.rmtree(dir_path)
except OSError as e:
print("Error: %s: %s" % (dir_path, e.strerror))
Аргумент, передаваемый в shutil.rmtree()
, не может быть символической ссылкой на каталог.
Вывод
Python предоставляет несколько модулей для управления файлами.
Мы видели, как использовать os.remove()
, os.unlink()
и pathlib.Path.unlink()
для удаления одного файла, os.rmdir()
и pathlib.Path.rmdir()
для удаления пустого каталога и shutil.rmtree()
для рекурсивного удаления каталога и всего его содержимого.
Будьте особенно осторожны при удалении файлов или каталогов, потому что после удаления файла его нелегко восстановить.