Xóa tất cả các tệp trong một thư mục bằng Python


147

Tôi muốn xóa tất cả các tập tin với phần mở rộng .baktrong một thư mục. Làm thế nào tôi có thể làm điều đó trong Python?


5
@ slh2080: Đăng bài "Đã 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 vấn đề của bạn.
S.Lott

1
Lấy làm tiếc. Cảm ơn đã chỉ ra sai lầm của tôi. Đó không phải là bài tập về nhà, chỉ là học trăn khi rảnh rỗi. Tôi bấm vào câu trả lời tôi đã sử dụng nhưng đó là trước khi tôi thấy phản hồi ghostdog74.
slh2080

lưu ý: để xóa toàn bộ cây thư mục shutil.rmtree(path)có thể được sử dụng .
jfs

Câu trả lời:


270

Qua 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 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.


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

@ 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

5
Coi chừng os.listdir (".") !!! Tôi đã sử dụng mã này và quên thay đổi đường dẫn, tất cả mã của tôi đã biến mất !!! Đã thử hai tiện ích khác nhau để phục hồi nhưng không có may mắn !!
Lei Guo

@LeiGuo Đã sửa.
yugr

26

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.unlinkos.removelà 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)

18

Trong Python 3.5, os.scandirsẽ 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.DirEntrycá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.


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

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

8

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")


1

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)

3
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 là di động và nó có thể đắt hơn do có thêm quy trình. Tốt hơn để sử dụng API Python.
Haakon

0

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))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.