Видалення всіх файлів у каталозі з Python


147

Я хочу видалити всі файли з розширенням .bakу каталозі. Як я можу це зробити в Python?


5
@ slh2080: Публікація "Вирішено" - це не те, що ви робите на цьому веб-сайті. Що ви робите - це вибрати відповідь, який ви насправді використовували, і натисніть прапорець, щоб вказати, що це вирішило вашу проблему.
С.Лотт

1
Вибачте. Дякую, що вказали на мою помилку. Це не домашнє завдання, а просто вивчення пітона у вільний час. Я натиснув відповідь, яку я використав, але це було до того, як я побачив відповідь ghostdog74.
slh2080

Примітка: для видалення цілого дерева каталогів shutil.rmtree(path)може використовуватися .
jfs

Відповіді:


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 in os.listdir ("."), Якщо f.endswith (". Bak")] - як розуміння списків, яке слід використовувати. Або ви можете перемістити 'if' у розумінні в цикл for - for f in 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)

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"):
Теймур

Дякую! Це навчить мене писати код, фактично не запускаючи їх
Йі Цзян

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")


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))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.