Удаление всех файлов в каталоге с Python
Я хочу удалить все файлы с расширением .bak
в каталоге. Как я могу сделать это в Python?
9 ответов
С помощью os.listdir
а также os.remove
:
import os
filelist = [ f for f in os.listdir(mydir) if f.endswith(".bak") ]
for f in filelist:
os.remove(os.path.join(mydir, f))
Или через glob.glob
:
import glob, os, os.path
filelist = glob.glob(os.path.join(mydir, "*.bak"))
for f in filelist:
os.remove(f)
Убедитесь, что вы находитесь в правильном каталоге, в конечном итоге используя os.chdir
,
В Python 3.5 os.scandir
лучше, если вам нужно проверить атрибуты или тип файла - см. os.DirEntry
для свойств объекта, который возвращается функцией.
import os
for file in os.scandir(path):
if file.name.endswith(".bak"):
os.unlink(file.path)
Это также не требует смены каталогов, так как каждый DirEntry
уже включает полный путь к файлу.
Использование os.chdir
сменить каталог. использование glob.glob
создать список имен файлов, которые заканчиваются на ".bak". Элементы списка - это просто строки.
Тогда вы могли бы использовать os.unlink
удалить файлы. (PS. os.unlink
а также os.remove
являются синонимами для одной и той же функции.)
#!/usr/bin/env python
import glob
import os
directory='/path/to/dir'
os.chdir(directory)
files=glob.glob('*.bak')
for filename in files:
os.unlink(filename)
Вы можете создать функцию. Добавьте maxdepth, как вам нравится, для обхода подкаталогов.
def findNremove(path,pattern,maxdepth=1):
cpath=path.count(os.sep)
for r,d,f in os.walk(path):
if r.count(os.sep) - cpath <maxdepth:
for files in f:
if files.endswith(pattern):
try:
print "Removing %s" % (os.path.join(r,files))
#os.remove(os.path.join(r,files))
except Exception,e:
print e
else:
print "%s removed" % (os.path.join(r,files))
path=os.path.join("/home","dir1","dir2")
findNremove(path,".bak")
Я понимаю, что это старо; Тем не менее, здесь было бы, как это сделать, используя только модуль OS...
def purgedir(parent):
for root, dirs, files in os.walk(parent):
for item in files:
# Delete subordinate files
filespec = os.path.join(root, item)
if filespec.endswith('.bak'):
os.unlink(filespec)
for item in dirs:
# Recursively perform this operation for subordinate directories
purgedir(os.path.join(root, item))
Для однолинейного решения (ОбаWindows
иLinux
) ;
import glob,os
for file in glob.glob("<your_path>/*.bak"): print(file," this will be deleted")
if input("continue ?") == "Y":
for file in glob.glob("<your_path>/*.bak"): os.remove(file)
Или используя pathlib.Path:
from pathlib import Path
for file in Path("/path/to/folder").glob("*"):
file.unlink()
Таким образом, можно также указать удалять только файлы, соответствующие шаблону glob. Например: .glob("*.txt") для удаления только текстовых файлов.
А для рекурсивного удаления всех файлов в подпапках просто используйте rglob вместо glob. Следующее приведет к удалению всех txt-файлов в указанной папке и всех ее подпапках:
for file in Path("/path/to/folder").rglob("*.txt"):
file.unlink()
В Linux и macOS вы можете запустить простую команду в оболочке:
subprocess.run('rm /tmp/*.bak', shell=True)