2009-06-24 45 views
29

Đang cố gắng để loại bỏ tất cả các tập tin trong một thư mục nào đó mang lại cho tôi những lỗi follwing:Hủy bỏ tất cả các file trong một thư mục

OSError: [Errno 2] No such file or directory: '/home/me/test/*' 

Mã Tôi đang chạy là:

import os 
test = "/home/me/test/*" 
os.remove(test) 
+0

tài liệu chính thức của os.walk không có một bản demo :) http: // docs. python.org/library/os.html#os.walk – sunqiang

Trả lời

38

os.remove() không hoạt động trên một thư mục và os.rmdir() sẽ chỉ hoạt động trên một thư mục trống. Và Python sẽ không tự động mở rộng "/ home/me/test/*" giống như một số hệ vỏ làm.

Tuy nhiên, bạn có thể sử dụng shutil.rmtree() trên thư mục để thực hiện việc này.

import shutil 
shutil.rmtree('/home/me/test') 

hãy cẩn thận vì nó loại bỏ các tập tin và thư mục con là tốt.

+2

nhập khẩu; shutil.rmtree ('/ home/me/test') –

+14

Lưu ý rằng việc sử dụng shutil.rmtree() cũng sẽ xóa thư mục ở cuối đường dẫn đã cho (nó không xóa nội dung thư mục mà nó xóa thư mục) – James

+0

mà doesn không giải thích tại sao '/ home/me/test/*' không được chấp nhận bởi 'os.remove'. Tôi đã chỉnh sửa câu trả lời. –

0

os. xóa sẽ chỉ xóa một tệp.

Để xóa bằng ký tự đại diện, bạn sẽ cần phải viết thói quen của riêng bạn để xử lý việc này.

quite a few suggested approaches được liệt kê trên trang diễn đàn này.

7

Vì * là cấu trúc vỏ. Python thực sự đang tìm kiếm một tệp có tên "*" trong thư mục/home/me/test. Sử dụng listdir để có được một danh sách các tập tin đầu tiên và sau đó gọi loại bỏ trên mỗi tập tin.

10

os.remove không giải quyết các mẫu kiểu unix. Nếu bạn đang ở trên một hệ thống unix-like bạn có thể:

os.system('rm '+test) 

khác bạn có thể:

import glob, os 
test = '/path/*' 
r = glob.glob(test) 
for i in r: 
    os.remove(i) 
+0

os.system có nhiều cảnh báo, bao gồm cả việc không giải quyết các mẫu glob (hoặc là nó chỉ truyền dòng cho shell); glob trả về các thư mục cũng như các tệp (mà os.remove không xử lý) –

+0

câu trả lời hay nhất cho đến nay: –

1

sao được mở rộng bởi vỏ Unix. Cuộc gọi của bạn không truy cập vào trình bao, nó chỉ cố xóa một tệp có tên kết thúc bằng dấu sao

0

shutil.rmtree() cho hầu hết các trường hợp. Nhưng nó không hoạt động trong Windows cho các tệp chỉ đọc. Đối với cửa sổ nhập khẩu win32api và win32con mô-đun từ PyWin32.

def rmtree(dirname): 
    retry = True 
    while retry: 
     retry = False 
     try: 
      shutil.rmtree(dirname) 
     except exceptions.WindowsError, e: 
      if e.winerror == 5: # No write permission 
       win32api.SetFileAttributes(dirname, win32con.FILE_ATTRIBUTE_NORMAL) 
       retry = True 
5

Một cách tôi đã làm điều này:

os.popen('rm -f ./yourdir') 
+0

không di động và thư mục 'rm -f' không hoạt động. Tôi tự hỏi tại sao điều này lại được bình chọn nhiều. –

0

hãy xem câu trả lời của tôi ở đây:

https://stackoverflow.com/a/24844618/2293304

Đó là một giải pháp lâu dài và xấu xí, nhưng đáng tin cậy và hiệu quả.

Nó giải quyết một vài vấn đề mà không được giải quyết bằng những người trả lời khác:

  • Nó xử lý một cách chính xác liên kết tượng trưng, ​​trong đó có không gọi shutil.rmtree() trên một liên kết tượng trưng (mà sẽ vượt qua bài kiểm tra os.path.isdir() nếu nó liên kết đến một danh mục).
  • Nó xử lý tệp chỉ đọc độc đáo.
+0

trong trường hợp đó, cách tốt nhất là gắn cờ là trùng lặp. –

0
#python 2.7 
import tempfile 
import shutil 
import exceptions 
import os 

def TempCleaner(): 
    temp_dir_name = tempfile.gettempdir() 
    for currentdir in os.listdir(temp_dir_name): 
     try: 
      shutil.rmtree(os.path.join(temp_dir_name, currentdir)) 
     except exceptions.WindowsError, e: 
      print u'Не удалось удалить:'+ e.filename 
2

Mặc dù đây là một câu hỏi cũ, tôi nghĩ không đã trả lời sử dụng phương pháp này:

#python 2.7 
import os 

filesToRemove = [f for f in os.listdir('/home/me/test')] 
os.remove(f) for f in files 
+2

Bạn cần phải bao gồm đường dẫn đầy đủ đến tệp khi bạn sử dụng 'os.remove()', vì vậy bạn phải thực hiện 'os.remove (os.path.join ("/home/me/test ", f)) 'để làm việc này. – deef

+0

cộng với dòng 'os.remove (f) cho f trong tệp' không phải là cú pháp hợp lệ. Không phải mọi thứ đều sử dụng hiểu. –

+0

Tôi khá thích câu trả lời này, sử dụng các cuộc gọi 'os'. Tôi đã sử dụng nó làm cơ sở cho công việc của mình: 'filesToRemove = [f cho f trong os.listdir (self.my_folder)] cho f trong filesToRemove: os.remove (os.path.join (self.my_folder, f)) '(yêu cầu thụt đầu dòng). – wmorrison365

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