Удаление всех файлов в каталоге с 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)
Другие вопросы по тегам