Tôi muốn xóa tất cả các tập tin với phần mở rộng .bak
trong một thư mục. Làm thế nào tôi có thể làm điều đó trong Python?
shutil.rmtree(path)
có thể được sử dụng .
Tôi muốn xóa tất cả các tập tin với phần mở rộng .bak
trong một thư mục. Làm thế nào tôi có thể làm điều đó trong Python?
shutil.rmtree(path)
có thể được sử dụng .
Câu trả lời:
Qua os.listdir
và 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))
Hoặc thông qua glob.glob
:
import glob, os, os.path
filelist = glob.glob(os.path.join(mydir, "*.bak"))
for f in filelist:
os.remove(f)
Hãy chắc chắn là trong thư mục chính xác, cuối cùng sử dụng os.chdir
.
Sử dụng os.chdir
để thay đổi thư mục. Sử dụng glob.glob
để tạo danh sách tên tệp kết thúc '.bak'. Các yếu tố của danh sách chỉ là chuỗi.
Sau đó, bạn có thể sử dụng os.unlink
để loại bỏ các tập tin. (PS. os.unlink
Và os.remove
là từ đồng nghĩa cho cùng chức năng.)
#!/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)
Trong Python 3.5, os.scandir
sẽ tốt hơn nếu bạn cần kiểm tra các thuộc tính hoặc loại tệp - xem os.DirEntry
các thuộc tính của đối tượng được hàm trả về.
import os
for file in os.scandir(path):
if file.name.endswith(".bak"):
os.unlink(file.path)
Điều này cũng không yêu cầu thay đổi thư mục vì mỗi thư mục DirEntry
đã bao gồm đường dẫn đầy đủ đến tệp.
if file.name.endswith(".bak"):
bạn có thể tạo một chức năng. Thêm maxdepth như bạn muốn để duyệt qua các thư mục con.
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")
Đầu tiên toàn cầu , sau đó bỏ liên kết .
Trên Linux và macOS, bạn có thể chạy lệnh đơn giản tới trình bao:
subprocess.run('rm /tmp/*.bak', shell=True)
Tôi nhận ra điều này là cũ; tuy nhiên, đây là cách để sử dụng mô-đun 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))