2010-01-03 41 views
123

Tôi muốn xóa tất cả các tệp có 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?Xóa tất cả các tập tin trong một thư mục bằng Python

+5

@ slh2080: Đăng "Giải Quyết" không phải là những gì bạn làm trên trang web này. Những gì bạn làm là chọn câu trả lời mà bạn thực sự đã sử dụng và nhấp vào dấu kiểm để cho biết rằng nó đã giải quyết được sự cố của bạn. –

+0

Xin lỗi. Cảm ơn vì đã chỉ ra sai lầm của tôi. Nó không phải là bài tập về nhà, chỉ cần học python trong thời gian rảnh rỗi của tôi. Tôi nhấp vào câu trả lời tôi đã sử dụng nhưng đó là trước khi tôi nhìn thấy phản ứng ghostdog74. – slh2080

+0

lưu ý: để xóa toàn bộ cây thư mục ['shutil.rmtree (đường dẫn)' có thể sử dụng] (https://docs.python.org/3/library/shutil.html#shutil.rmtree). – jfs

Trả lời

221

Via os.listdiros.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 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 để có trong thư mục chính xác, cuối cùng sử dụng os.chdir.

+16

Ví dụ đầu tiên của bạn đang sử dụng dự phòng cho các vòng lặp. Bạn có thể vượt qua - [os.remove (f) cho f trong os.listdir (".") Nếu f.endswith (". Bak")] - khi danh sách hiểu được có nghĩa là để được sử dụng. Hoặc bạn có thể di chuyển 'if' trong phần hiểu thành vòng lặp for - cho f trong os.listdir ("."): nếu f.endswith (". Bak"): os.remove (f) – dragonjujo

+0

@ slh2080 Vì bạn nói vấn đề đã được giải quyết, tại sao không đánh dấu câu trả lời là câu trả lời đúng? – blwy10

+4

@dragonjujo, vâng tôi biết, nhưng tôi nghĩ nó sẽ rõ ràng hơn theo cách này .. – miku

23

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 phần tử của danh sách chỉ là các chuỗi.

Sau đó, bạn có thể sử dụng os.unlink để xóa tệp. (PS. os.unlinkos.remove là từ đồng nghĩa cho các chức năng tương tự.)

#!/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) 
6

bạn có thể tạo một hàm. 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") 
7

Trong Python 3.5, os.scandir là tốt hơn nếu bạn cần phải kiểm tra cho các thuộc tính tập tin hoặc loại - xem os.DirEntry đối với tài sản của đối tượng đó là trả về bởi hàm.

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 DirEntry đã bao gồm đường dẫn đầy đủ vào tệp.

+0

Bạn đang thiếu dấu hai chấm, dòng đầu tiên bên trong vòng lặp for nên là 'if file.name.endswith (". Bak "):' – TSeymour

+0

Cảm ơn!Điều đó sẽ dạy tôi viết mã mà không thực sự chạy chúng –

0

Trên Linux và MacOS bạn có thể chạy lệnh đơn giản để vỏ:

subprocess.run('rm /tmp/*.bak', shell=True) 
+0

Không phải là một lựa chọn tốt trong quan điểm của tôi. Nó không phải di động và nó có thể đắt hơn do quá trình phụ phụ. Tốt hơn để sử dụng các API Python. – Haakon

Các vấn đề liên quan