ฉันต้องการลบไฟล์ทั้งหมดที่มีนามสกุล.bak
ในไดเรกทอรี ฉันจะทำสิ่งนั้นใน Python ได้อย่างไร
shutil.rmtree(path)
ฉันต้องการลบไฟล์ทั้งหมดที่มีนามสกุล.bak
ในไดเรกทอรี ฉันจะทำสิ่งนั้นใน Python ได้อย่างไร
shutil.rmtree(path)
คำตอบ:
ผ่าน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
ให้แน่ใจว่าจะอยู่ในไดเรกทอรีที่ถูกต้องที่สุดโดยใช้
ใช้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)
ใน 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
ไฟล์มีพา ธ เต็มไปยังไฟล์แล้ว
if file.name.endswith(".bak"):
คุณสามารถสร้างฟังก์ชั่น เพิ่ม 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")
แรกglobพวกเขาแล้วยกเลิกการเชื่อมโยง
บน Linux และ macOS คุณสามารถรันคำสั่งแบบง่ายไปยังเชลล์:
subprocess.run('rm /tmp/*.bak', shell=True)
ฉันรู้ว่ามันเก่า; อย่างไรก็ตามนี่จะเป็นวิธีการใช้เพียงแค่โมดูล 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))