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.