การลบไฟล์ทั้งหมดในไดเรกทอรีด้วย Python


147

ฉันต้องการลบไฟล์ทั้งหมดที่มีนามสกุล.bakในไดเรกทอรี ฉันจะทำสิ่งนั้นใน Python ได้อย่างไร


5
@ slh2080: การโพสต์ "แก้ไข" ไม่ใช่สิ่งที่คุณทำในเว็บไซต์นี้ สิ่งที่คุณทำคือเลือกคำตอบที่คุณใช้จริง ๆ แล้วคลิกเครื่องหมายถูกเพื่อระบุว่าแก้ไขปัญหาของคุณได้แล้ว
S.Lott

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 ใน os.listdir (".") ถ้า f.endswith (". bak")] - เนื่องจากความเข้าใจในรายการนั้นถูกนำมาใช้ หรือคุณสามารถย้าย 'if' ในความเข้าใจไปสู่ ​​for loop - สำหรับ f ใน os.listdir ("."): ถ้า f.endswith (". bak"): os.remove (f)
dragonjujo

@ slh2080 เนื่องจากคุณบอกว่าปัญหาได้รับการแก้ไขแล้วทำไมไม่ทำเครื่องหมายคำตอบว่าเป็นคำตอบที่ถูกต้อง?
blwy10

5
ระวัง os.listdir (".") !!! ฉันใช้รหัสนี้และลืมเปลี่ยนเส้นทางรหัสของฉันทั้งหมดหายไป !!! พยายามกู้คืนสาธารณูปโภคสองอย่างที่แตกต่างกัน แต่ไม่มีโชค !!
Lei Guo

@LeiGuo แก้ไขสิ่งนั้น
yugr

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 for loop ควรเป็นif file.name.endswith(".bak"):
TSeymour

ขอบคุณ! นั่นจะสอนให้ฉันเขียนโค้ดโดยที่ไม่ต้องเรียกใช้พวกเขา
Yi Jiang

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
ไม่ใช่ทางเลือกที่ดีในความคิดของฉัน มันไม่ได้พกพาและอาจมีราคาแพงกว่าเนื่องจากกระบวนการย่อยเพิ่มเติม ควรใช้ Python APIs ดีกว่า
ฮา

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))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.