Как я могу удалить содержимое локальной папки в Python?
Текущий проект предназначен для Windows, но я бы тоже хотел увидеть * nix.
Как я могу удалить содержимое локальной папки в Python?
Текущий проект предназначен для Windows, но я бы тоже хотел увидеть * nix.
Вы можете просто сделать это:
import os
import glob
files = glob.glob('/YOUR/PATH/*')
for f in files:
os.remove(f)
Конечно, вы можете использовать другой фильтр в своем пути, например: /YOU/PATH/*.txt для удаления всех текстовых файлов в каталоге.
*
не будет отображать скрытые файлы, мы также должны добавить glob.glob('path/.*)
- person satoru; 01.11.2013
import sh; sh.rm(files)
- person Robin Winslow; 12.05.2014
import sh; sh.rm(files)
действительно выглядит красивее, вы столкнетесь с проблемами, если в каталоге более 1024 файлов.
- person Eugene; 01.11.2019
Вы можете удалить саму папку, а также все ее содержимое, используя _1 _:
import shutil
shutil.rmtree('/path/to/folder')
shutil.rmtree(path, ignore_errors=False, onerror=None)
Удалить все дерево каталогов; путь должен указывать на каталог (но не на символическую ссылку на каталог). Если ignore_errors истинно, ошибки, возникающие в результате неудачного удаления, будут игнорироваться; если false или опущено, такие ошибки обрабатываются путем вызова обработчика, указанного в onerror, или, если он опущен, они вызывают исключение.
rmtree
. Как 2_
- person Iulius Curt; 14.06.2013
OSError: [Errno 16] Device or resource busy
- person Arnaud P; 13.12.2018
os.remove()
не работает, Mac работает на Big Sur
- person cryanbhu; 10.12.2020
Расширяя ответ mhawke, это то, что я реализовал. Он удаляет все содержимое папки, но не саму папку. Протестировано в Linux с файлами, папками и символическими ссылками, также должно работать в Windows.
import os
import shutil
for root, dirs, files in os.walk('/path/to/folder'):
for f in files:
os.unlink(os.path.join(root, f))
for d in dirs:
shutil.rmtree(os.path.join(root, d))
walk
используется для разделения каталогов и файлов, которые должны обрабатываться по-разному. Вы также можете использовать os.listdir
, но вам придется вручную проверять, является ли каждая запись каталогом или файлом.
- person dkamins; 16.03.2012
os.walk
здесь не будет рекурсивно, потому что он возвращает генератор, который рекурсивно просматривает подкаталоги только при попытке его продвижения, и к тому времени, когда вы выполните свою первую итерацию этого цикла, нет подкаталоги, оставленные для просмотра. По сути, os.walk
здесь просто используется как альтернативный способ отличить папки верхнего уровня от файлов верхнего уровня; рекурсия не используется, и мы не платим за ее производительность. Однако это эксцентрично, и я согласен с тем, что предложенный вами подход лучше просто потому, что он более ясен и удобочитаем.
- person Mark Amery; 23.11.2019
Использование rmtree
и воссоздание папки может работать, но я столкнулся с ошибками при удалении и немедленном воссоздании папок на сетевых дисках.
Предлагаемое решение с использованием обхода не работает, поскольку оно использует rmtree
для удаления папок, а затем может попытаться использовать os.unlink
для файлов, которые ранее находились в этих папках. Это вызывает ошибку.
Опубликованное решение glob
также попытается удалить непустые папки, что приведет к ошибкам.
Предлагаю вам использовать:
folder_path = '/path/to/folder'
for file_object in os.listdir(folder_path):
file_object_path = os.path.join(folder_path, file_object)
if os.path.isfile(file_object_path) or os.path.islink(file_object_path):
os.unlink(file_object_path)
else:
shutil.rmtree(file_object_path)
os.path.isfile()
вернет False
(потому что он следует по символическим ссылкам), и вы в конечном итоге вызовете shutil.rmtree()
для символической ссылки, которая вызовет OSError("Cannot call rmtree on a symbolic link")
.
- person Rockallite; 19.07.2014
if os.path.islink(file_object_path): os.unlink(file_object_path)
и преобразовал if в else if.
- person Kevin; 14.02.2019
rmtree
для удаления папок, а затем может попытаться использовать os.unlink
для файлов, которые ранее находились в этих папках - это не то, что я наблюдаю при использовании локального диска на моем Mac. Генератор, возвращенный из os.walk
, просто не дает второй элемент, если вы удалили все папки на первой итерации. Я могу поверить, что есть какая-то файловая система или среда, для которых это верно (например, сетевой диск), но это определенно не универсальная правда.
- person Mark Amery; 23.11.2019
islink
проверки здесь для правильной обработки символических ссылок на каталоги. Я добавил такую проверку к принятому ответу.
- person Mark Amery; 23.11.2019
Я удивлен, что никто не упомянул о том, насколько pathlib
замечательно справляется с этой работой.
Если вы хотите удалить только файлы в каталоге, это может быть единственная инструкция.
from pathlib import Path
[f.unlink() for f in Path("/path/to/folder").glob("*") if f.is_file()]
Чтобы также рекурсивно удалять каталоги, вы можете написать что-то вроде этого:
from pathlib import Path
from shutil import rmtree
for path in Path("/path/to/folder").glob("**/*"):
if path.is_file():
path.unlink()
elif path.is_dir():
rmtree(path)
.iterdir()
вместо .glob(...)
тоже должно работать.
- person S. Kirby; 14.11.2019
Этот:
Код:
for filename in os.listdir(dirpath):
filepath = os.path.join(dirpath, filename)
try:
shutil.rmtree(filepath)
except OSError:
os.remove(filepath)
Как и многие другие ответы, это не пытается настроить разрешения, чтобы разрешить удаление файлов / каталогов.
В качестве единственного лайнера:
import os
# Python 2.7
map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) )
# Python 3+
list( map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) ) )
Более надежным решением, учитывающим файлы и каталоги, будет (2.7):
def rm(f):
if os.path.isdir(f): return os.rmdir(f)
if os.path.isfile(f): return os.unlink(f)
raise TypeError, 'must be either file or directory'
map( rm, (os.path.join( mydir,f) for f in os.listdir(mydir)) )
map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) )
- person user25064; 18.09.2014
list(map(os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir))))
- person user25064; 19.09.2014
map
в list
, чтобы выполнить итерацию. См. http://stackoverflow.com/questions/1303347/getting-a-map-to-return-a-list-in-python-3-x
- person paulwasit; 07.10.2016
Примечания. Если кто-то проголосует против моего ответа, мне нужно кое-что объяснить.
shutil.rmtree()
можно использовать для удаления дерева каталогов. Я использовал его много раз в своих проектах. Но вы должны понимать, что сам каталог также будет удален shutil.rmtree()
. Хотя для некоторых это может быть приемлемо, это не правильный ответ для удаления содержимого папки (без побочных эффектов).shutil.rmtree()
и восстанавливаете с помощью os.mkdir()
. Вместо этого вы получите пустой каталог с битами владельца и режима по умолчанию (унаследованный). Хотя у вас может быть привилегия на удаление содержимого и даже каталога, вы не сможете восстановить исходные биты владельца и режима в каталоге (например, вы не суперпользователь).Вот длинное и некрасивое, но надежное и эффективное решение.
Он решает несколько проблем, которые не решаются другими респондентами:
shutil.rmtree()
для символической ссылки (которая пройдет проверку os.path.isdir()
, если она ссылается на каталог; даже результат os.walk()
также содержит каталоги с символическими ссылками).Вот код (единственная полезная функция - clear_dir()
):
import os
import stat
import shutil
# http://stackoverflow.com/questions/1889597/deleting-directory-in-python
def _remove_readonly(fn, path_, excinfo):
# Handle read-only files and directories
if fn is os.rmdir:
os.chmod(path_, stat.S_IWRITE)
os.rmdir(path_)
elif fn is os.remove:
os.lchmod(path_, stat.S_IWRITE)
os.remove(path_)
def force_remove_file_or_symlink(path_):
try:
os.remove(path_)
except OSError:
os.lchmod(path_, stat.S_IWRITE)
os.remove(path_)
# Code from shutil.rmtree()
def is_regular_dir(path_):
try:
mode = os.lstat(path_).st_mode
except os.error:
mode = 0
return stat.S_ISDIR(mode)
def clear_dir(path_):
if is_regular_dir(path_):
# Given path is a directory, clear its content
for name in os.listdir(path_):
fullpath = os.path.join(path_, name)
if is_regular_dir(fullpath):
shutil.rmtree(fullpath, onerror=_remove_readonly)
else:
force_remove_file_or_symlink(fullpath)
else:
# Given path is a file or a symlink.
# Raise an exception here to avoid accidentally clearing the content
# of a symbolic linked directory.
raise OSError("Cannot call clear_dir() on a symbolic link")
os.remove
, в отличие от утилиты rm
, с радостью удаляет файлы, доступные только для чтения, если они принадлежат вам. Между тем, если это файл, которым вы не владеете и к которому у вас есть доступ только для чтения, вы не можете удалить его или изменить его права доступа. Я не знаю ни одной ситуации, в которой вы не смогли бы удалить файл, доступный только для чтения, с os.remove
, но при этом смогли бы изменить его разрешения. Кроме того, вы используете lchmod
, которого нет ни на моем Mac, ни в Windows, согласно его документации. Для какой платформы предназначен этот код ?!
- person Mark Amery; 23.11.2019
Использование протокола os.scandir и диспетчера контекста в Python 3.6+:
import os
import shutil
with os.scandir(target_dir) as entries:
for entry in entries:
if entry.is_dir() and not entry.is_symlink():
shutil.rmtree(entry.path)
else:
os.remove(entry.path)
Более ранние версии Python:
import os
import shutil
# Gather directory contents
contents = [os.path.join(target_dir, i) for i in os.listdir(target_dir)]
# Iterate and remove each item in the appropriate manner
[shutil.rmtree(i) if os.path.isdir(i) and not os.path.islink(i) else os.remove(i) for i in contents]
os.path.isdir()
не является правильным способом отличить обычный каталог от символической ссылки. Вызов shutil.rmtree()
по символической ссылке вызовет OSError
исключение.
- person Rockallite; 20.07.2014
is_file()
: по крайней мере, в Unix основной системный вызов для удаления специальных файлов такой же, как и для обычных файлов - отменить связь. Только настоящие каталоги нуждаются в рекурсивной обработке, т.е. is_dir() and not is_symlink()
(чтобы правильно обрабатывать символические ссылки на каталоги, как вы это уже делаете).
- person user2394284; 26.05.2021
Раньше я решал проблему так:
import shutil
import os
shutil.rmtree(dirpath)
os.mkdir(dirpath)
(that's on me)
, но это действительно так нет .. так что этот ответ все еще в порядке! Зависит от того, кто читает это в Интернете, и как они думают, что этот ответ повлияет на их программу.
- person Ice Bear; 17.12.2020
Чтобы удалить все файлы внутри каталога, а также его подкаталоги, не удаляя сами папки, просто сделайте следующее:
import os
mypath = "my_folder" #Enter your path here
for root, dirs, files in os.walk(mypath):
for file in files:
os.remove(os.path.join(root, file))
Возможно, вам лучше использовать для этого os.walk()
.
os.listdir()
не различает файлы и каталоги, и вы быстро столкнетесь с проблемами, пытаясь отсоединить их. Хороший пример использования os.walk()
для рекурсивного удаления каталога здесь, и подсказывает, как приспособить его к вашим обстоятельствам.
Если вы используете систему * nix, почему бы не использовать системную команду?
import os
path = 'folder/to/clean'
os.system('rm -rf %s/*' % path)
os.system
+ обработка строки + неправильное цитирование = внедрение оболочки
- person user2394284; 26.05.2021
Мне пришлось удалить файлы из 3 отдельных папок внутри единственного родительского каталога:
directory
folderA
file1
folderB
file2
folderC
file3
Этот простой код помог мне: (Я использую Unix)
import os
import glob
folders = glob.glob('./path/to/parentdir/*')
for fo in folders:
file = glob.glob(f'{fo}/*')
for f in file:
os.remove(f)
Надеюсь это поможет.
Еще одно решение:
import sh
sh.rm(sh.glob('/path/to/folder/*'))
sh
не входит в стандартную библиотеку и требует установки из PyPI, прежде чем вы сможете ее использовать. Кроме того, поскольку это фактически вызывает rm
в подпроцессе, он не будет работать в Windows, где rm
не существует. Это также вызовет исключение, если папка содержит какие-либо подкаталоги.
- person Mark Amery; 23.11.2019
Я знаю, что это старая ветка, но я нашел кое-что интересное на официальном сайте python. Просто для того, чтобы поделиться еще одной идеей по удалению всего содержимого в каталоге. Потому что у меня возникают проблемы с авторизацией при использовании shutil.rmtree (), и я не хочу удалять каталог и воссоздавать его. Исходный адрес: http://docs.python.org/2/library/os.html#os.walk. Надеюсь, что это может кому-то помочь.
def emptydir(top):
if(top == '/' or top == "\\"): return
else:
for root, dirs, files in os.walk(top, topdown=False):
for name in files:
os.remove(os.path.join(root, name))
for name in dirs:
os.rmdir(os.path.join(root, name))
Довольно интуитивно понятный способ сделать это:
import shutil, os
def remove_folder_contents(path):
shutil.rmtree(path)
os.makedirs(path)
remove_folder_contents('/path/to/folder')
Что ж, я думаю, что этот код работает. Он не удалит папку, и вы можете использовать этот код для удаления файлов с определенным расширением.
import os
import glob
files = glob.glob(r'path/*')
for items in files:
os.remove(items)
Я решил проблему с rmtree
makedirs
, добавив time.sleep()
между:
if os.path.isdir(folder_location):
shutil.rmtree(folder_location)
time.sleep(.5)
os.makedirs(folder_location, 0o777)
Используйте описанный ниже метод для удаления содержимого каталога, а не самого каталога:
import os
import shutil
def remove_contents(path):
for c in os.listdir(path):
full_path = os.path.join(path, c)
if os.path.isfile(full_path):
os.remove(full_path)
else:
shutil.rmtree(full_path)
Чтобы удалить все файлы в папке, я использую:
import os
for i in os.listdir():
os.remove(i)
IsADirectoryError
.
- person piit79; 12.05.2021
Ответ для ограниченной конкретной ситуации: предполагая, что вы хотите удалить файлы, поддерживая дерево вложенных папок, вы можете использовать рекурсивный алгоритм:
import os
def recursively_remove_files(f):
if os.path.isfile(f):
os.unlink(f)
elif os.path.isdir(f):
for fi in os.listdir(f):
recursively_remove_files(os.path.join(f, fi))
recursively_remove_files(my_directory)
Может немного не по теме, но думаю, многим это пригодится
os.walk
способом, показанным на странице stackoverflow.com/a/54889532/1709587, возможно, лучший способ удалить все файлы, пока оставляя структуру каталогов нетронутой.
- person Mark Amery; 23.11.2019
самый простой способ удалить все файлы в папке / удалить все файлы
import os
files = os.listdir(yourFilePath)
for f in files:
os.remove(yourFilePath + f)
Это должно помочь, просто используя модуль ОС для вывода списка и последующего удаления!
import os
DIR = os.list('Folder')
for i in range(len(DIR)):
os.remove('Folder'+chr(92)+i)
Работал у меня, при любых проблемах дайте знать!
except Exception as e:
, которое читается как W0703: Catching too general exception Exception
. Есть ли более конкретное исключение, которое нужно уловить, или мне его игнорировать?
- person John Hany; 23.10.2017
os.system('rm -rf folder')
- person Tilak Maddy   schedule 23.11.2019