Удаление всех файлов в каталоге с Python

147

Я хочу удалить все файлы с расширением .bakв каталоге. Как я могу сделать это в Python?

slh2080
источник
5
@ slh2080: Публикация «Решено» - это не то, что вы делаете на этом сайте. Что вы делаете, это выберите ответ, который вы на самом деле использовали, и нажмите на галочку, чтобы указать, что это решило вашу проблему.
С.Лотт
1
Сожалею. Спасибо за указание на мою ошибку. Это не домашняя работа, просто изучение Python в свободное время. Я нажал на ответ, который использовал, но это было до того, как я увидел ответ ghostdog74.
slh2080
примечание: для удаления всего дерева каталогов shutil.rmtree(path)можно использовать .
Jfs
Возможный дубликат Как удалить содержимое папки в Python?
ФабиоСпагетти

Ответы:

270

Через 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.

Мик
источник
21
Ваш первый пример использует избыточные для циклов. Вы можете передать с - [os.remove (f) для f в os.listdir ("."), Если f.endswith (". Bak")] - в качестве списочных пониманий. Или вы можете переместить 'if' в понимании в цикл for - для f в os.listdir ("."): If f.endswith (". Bak"): os.remove (f)
dragonjujo
@ slh2080 Поскольку вы говорите, что проблема решена, почему бы не отметить ответ как правильный ответ?
blwy10
5
Остерегайтесь os.listdir (".") !!! Я использовал этот код и забыл изменить путь, весь мой код пропал !!! Пробовал две разные утилиты восстанавливать но без везения !!
Лэй Го
@LeiGuo Исправлено.
югр
26

Используйте, 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)
unutbu
источник
18

В 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уже содержит полный путь к файлу.

И Цзян
источник
Вы пропускаете двоеточие, первая строка внутри цикла for должна бытьif file.name.endswith(".bak"):
TSeymour
Спасибо! Это научит меня писать код, фактически не выполняя их
И Цзян
8

Вы можете создать функцию. Добавьте 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")
ghostdog74
источник
1

В Linux и macOS вы можете запустить простую команду в оболочке:

subprocess.run('rm /tmp/*.bak', shell=True)
Виталий Зданевич
источник
3
Не очень хороший выбор, на мой взгляд. Это не переносимо и, вероятно, дороже из-за дополнительного подпроцесса. Лучше использовать API-интерфейсы Python.
Хакон
0

Я понимаю, что это старо; однако, здесь было бы, как сделать это, используя только модуль 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))
M.Markfort
источник