Как удалить файл или папку в Python?
Как удалить файл или папку в Python?
Ответы (15)
-
os.remove()
удаляет файл. -
os.rmdir()
удаляет пустой каталог. -
shutil.rmtree()
удаляет каталог и все его содержимое.
Path
объекты из модуля Python 3.4+ pathlib
также предоставляют следующие методы экземпляра:
-
pathlib.Path.unlink()
удаляет файл или символическую ссылку. -
pathlib.Path.rmdir()
удаляет пустой каталог.
Это моя функция для удаления каталогов. Для «пути» требуется полное имя пути.
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))
Удаление файла или папки в Python
Существует несколько способов удаления файла в Python, но лучшие из них следующие:
- os.remove() удаляет файл.
- os.unlink() удаляет файл. это Unix-имя метода remove().
- shutil.rmtree() удаляет каталог и все его содержимое.
- 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()
Лично я предпочитаю работать с объектами 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.
Чтобы избежать проблемы 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()
удаляет не только каталог, но и его содержимое.
Чтобы удалить все файлы в папке
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))
Для удаления файлов:
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
Я рекомендую использовать subprocess
, если писать красивый и читаемый код - ваша чашка чая:
import subprocess
subprocess.Popen("rm -r my_dir", shell=True)
А если вы не инженер-программист, то, возможно, подумайте об использовании Jupyter; вы можете просто ввести команды bash:
!rm -r my_dir
Традиционно используется shutil
:
import shutil
shutil.rmtree(my_dir)
Подпроцесс - это практика, которую следует избегать
Я бы не рекомендовал для этого subprocess
. shutil.rmtree
отлично справляется с работой rm -r
, с дополнительным бонусом работы в Windows.
shutil.rmtree - асинхронная функция, поэтому, если вы хотите проверить, когда он завершится, вы можете использовать цикл while ...
import os
import shutil
shutil.rmtree(path)
while os.path.exists(path):
pass
print('done')
shutil.rmtree
не должен быть асинхронным. Однако может показаться, что в Windows вмешиваются антивирусные сканеры.
@mhsmith Сканеры вирусов ? Это безумные предположения, или вы действительно знаете, что они могут вызвать такой эффект? Как, черт возьми, это работает, если так?
Как удалить файл или папку в 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
- он рекурсивно удаляет только пустые каталоги, но это может соответствовать вашему варианту использования.
rmtree(directory_path)
работает в python 3.6.6, но не в python 3.5.2 - вам нужен rmtree(str(directory_path)))
там.
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)
Это приведет к удалению только файлов внутри папки и подпапок, оставляя структуру папок нетронутой.
Вы можете использовать встроенный модуль 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 К сожалению, кажется, что в pathlib
нет ничего (изначально), что могло бы обрабатывать удаление непустых каталогов. Однако вы можете использовать shutil.rmtree
. Об этом упоминалось в нескольких других ответах, поэтому я не включил его.
Синтаксис 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.
Лучшие практики
- Сначала проверьте, существует ли файл или папка, а затем удалите только этот файл. Этого можно добиться двумя способами:
а.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))
Обработка исключений рекомендуется вместо проверки, поскольку файл может быть удален или изменен между двумя строками (TOCTOU: en.wikipedia.org/wiki/Time_of_check_to_time_of_use) См. FAQ по Python docs.python.org/3 /glossary.html#term-eafp
какой смысл ловить исключение в самом последнем примере?
Вот надежная функция, которая использует как 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))
Т.е. 8 строк кода для имитации вызова ISO C remove(path);
.
@Kaz согласился, что раздражает, но убирает ли дело с деревьями? :-)
os.path.islink(file_path):
ошибка, должна быть os.path.islink(path):
os.rmdir () в Windows также удаляет символическую ссылку на каталог, даже если целевой каталог не пуст.
Если файл не существует,
os.remove()
генерирует исключение, поэтому может потребоваться сначала проверитьos.path.isfile()
или заключить вtry
.Я хочу, чтобы Path.unlink 1 / был рекурсивным 2 / добавить возможность игнорировать FileNotfoundError.
просто для завершения ... исключение, созданное
os.remove()
, если файл не существует, -FileNotFoundError
.Принимает ли
os.remove()
несколько аргументов для удаления нескольких файлов, или вы вызываете его каждый раз для каждого файла?Это уже нанесено на карту здесь: ao.gl/how-to-delete-a-file-in-python
@ Jérôme Я думаю, что
missing_ok=True
, добавлено в 3.8, решает эту проблему!os.removedirs удаляет ветку пустых каталогов (т.е. сначала удаляет пустой листовой каталог, а затем продолжает вверх по иерархии ветвей, удаляя все пустые каталоги).