Python ile bir dizindeki tüm dosyaları silme


151

.bakBir dizindeki uzantıya sahip tüm dosyaları silmek istiyorum . Bunu Python'da nasıl yapabilirim?


5
@ slh2080: Bu sitede yaptığınız şey "Çözüldü" değil. Yaptığınız şey, gerçekte kullandığınız cevabı seçmek ve sorununuzu çözdüğünü belirtmek için onay işaretini tıklamaktır.
— S. Lot

1
Afedersiniz. Hatamı işaret ettiğiniz için teşekkürler. Bu ev ödevi değil, sadece boş zamanlarımda python öğrenmek. Kullandığım cevaba tıkladım ama bu ghostdog74 cevabını görmeden önceydi.
— slh2080

not: tüm bir dizin ağacını silmek için shutil.rmtree(path)kullanılabilir .
— jfs

Yanıtlar:


278

Üzerinden os.listdirve 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))

Yalnızca tek bir döngü kullanarak:

for f in os.listdir(mydir):
    if not f.endswith(".bak"):
        continue
    os.remove(os.path.join(mydir, f))

Veya şu yolla glob.glob:

import glob, os, os.path

filelist = glob.glob(os.path.join(mydir, "*.bak"))
for f in filelist:
    os.remove(f)

Sonunda kullanarak doğru dizinde olduğunuzdan emin olun os.chdir.


21
İlk örneğiniz döngüler için fazladan kullanıyor. - [os.remove (f) for f in os.listdir (".") İf f.endswith (". Bak")] ile geçiş yapabilirsiniz - çünkü liste anlamalarının kullanılması amaçlanmıştır. Veya kavramadaki 'if'i for döngüsüne taşıyabilirsiniz - for f in os.listdir ("."): İf f.endswith (". Bak"): os.remove (f)
— dragonjujo

@ slh2080 Problemin çözüldüğünü söylediğinize göre, neden cevabı doğru cevap olarak işaretlemiyorsunuz?
— blwy10

5
Os.listdir'e (".") Dikkat edin !!! Bu kodu kullandım ve yolu değiştirmeyi unuttum, tüm kodum gitmişti !!! Kurtarmak için iki farklı yardımcı program denedim ama şanssız!
— Lei Guo

@LeiGuo Bunu düzeltti.
— yugr

@dragonjujo Yan etkilere başvurmanın, liste anlamalarının kullanılması gerektiği gibi olmadığını iddia ediyorum .
— marcelm

26

os.chdirDizini değiştirmek için kullanın . glob.glob'.Bak'ı sonlandıran bir dosya adları listesi oluşturmak için kullanın . Listenin öğeleri yalnızca dizelerdir.

Daha sonra os.unlinkdosyaları kaldırmak için kullanabilirsiniz . (Not. os.unlinkVe os.removeaynı işlevin eşanlamlılarıdır.)

#!/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'te, os.scandirdosya özniteliklerini veya türünü kontrol etmeniz gerekiyorsa daha iyidir - os.DirEntryişlev tarafından döndürülen nesnenin özelliklerine bakın .

import os 

for file in os.scandir(path):
    if file.name.endswith(".bak"):
        os.unlink(file.path)

Bu ayrıca, her biri DirEntrydosyanın tam yolunu içerdiğinden, dizinlerin değiştirilmesini gerektirmez .


if file.name.endswith(".bak"):
— İki

Teşekkürler! Bu bana onları çalıştırmadan kod yazmayı öğretecek
— Yi Jiang

8

bir işlev oluşturabilirsiniz. Alt dizinleri dolaşmak için istediğiniz kadar maksimum derinlik ekleyin.

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


0

Bunun eski olduğunun farkındayım; ancak, sadece os modülünü kullanarak bunu nasıl yapacağınız burada açıklanmaktadır ...

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

-2

Linux ve macOS'ta, kabuğa basit bir komut çalıştırabilirsiniz:

subprocess.run('rm /tmp/*.bak', shell=True)

3
Bence iyi bir seçim değil. Taşınabilir değildir ve ekstra alt işlem nedeniyle muhtemelen daha pahalıdır. Python API'lerini kullanmak daha iyidir.
— Haakon

bu çözüm platforma bağlıdır, oysa Python platformdan bağımsızdır.
— Hamza Rashid
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.