Menghapus semua file dalam direktori dengan Python

147

Saya ingin menghapus semua file dengan ekstensi .bakdi direktori. Bagaimana saya bisa melakukannya dengan Python?

slh2080
sumber
5
@ slh2080: Posting "Terpecahkan" bukan yang Anda lakukan di situs ini. Yang Anda lakukan adalah memilih jawaban yang benar-benar Anda gunakan dan klik tanda centang untuk menunjukkan bahwa itu menyelesaikan masalah Anda.
S.Lott
1
Maaf. Terima kasih telah menunjukkan kesalahan saya. Ini bukan pekerjaan rumah, hanya belajar python di waktu luang saya. Saya mengklik jawaban yang saya gunakan tetapi itu sebelum saya melihat tanggapan ghostdog74.
slh2080
catatan: untuk menghapus seluruh pohon direktori shutil.rmtree(path)bisa digunakan .
jfs
Kemungkinan duplikat dari Cara menghapus isi folder dengan Python?
FabioSpaghetti

Jawaban:

270

Via os.listdirdan 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))

Atau via glob.glob:

import glob, os, os.path

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

Pastikan berada di direktori yang benar, akhirnya gunakan os.chdir.

miku
sumber
21
Contoh pertama Anda menggunakan redundant untuk loop. Anda dapat lulus dengan - [os.remove (f) untuk f di os.listdir (".") Jika f.endswith (". Bak")] - karena pemahaman daftar dimaksudkan untuk digunakan. Atau Anda dapat memindahkan 'jika' dalam pemahaman ke dalam for loop - untuk f di os.listdir ("."): If f.endswith (". Bak"): os.remove (f)
dragonjujo
@ slh2080 Karena Anda mengatakan masalah telah diselesaikan, mengapa tidak menandai jawaban sebagai jawaban yang benar?
blwy10
5
Watch out the os.listdir (".") !!! Saya menggunakan kode ini dan lupa mengubah path, semua kode saya hilang !!! Sudah mencoba dua utilitas berbeda untuk memulihkan tetapi tidak berhasil !!
Lei Guo
@ LeiGuo Memperbaiki itu.
Yugr
26

Gunakan os.chdiruntuk mengubah direktori. Gunakan glob.globuntuk menghasilkan daftar nama file yang mengakhirinya '.bak'. Elemen daftar hanyalah string.

Maka Anda bisa menggunakan os.unlinkuntuk menghapus file. (PS. os.unlinkDan os.removemerupakan sinonim untuk fungsi yang sama.)

#!/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
sumber
18

Dalam Python 3.5, os.scandirlebih baik jika Anda perlu memeriksa atribut atau tipe file - lihat os.DirEntryproperti objek yang dikembalikan oleh fungsi.

import os 

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

Ini juga tidak memerlukan perubahan direktori karena masing-masing DirEntrysudah menyertakan path lengkap ke file.

Yi Jiang
sumber
Anda melewatkan titik dua, baris pertama di dalam for loop seharusnyaif file.name.endswith(".bak"):
TSeymour
Terima kasih! Itu akan mengajari saya untuk menulis kode tanpa benar-benar menjalankannya
Yi Jiang
8

Anda dapat membuat suatu fungsi. Tambahkan maxdepth sesuka Anda untuk melintasi subdirektori.

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
sumber
1

Di Linux dan macOS Anda dapat menjalankan perintah sederhana ke shell:

subprocess.run('rm /tmp/*.bak', shell=True)
Vitaly Zdanevich
sumber
3
Bukan pilihan yang baik menurut saya. Ini tidak portabel dan mungkin lebih mahal karena proses tambahan. Lebih baik menggunakan API Python.
Haakon
0

Saya menyadari ini sudah tua; namun, berikut ini cara melakukannya dengan hanya menggunakan modul 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
sumber