2009-05-02 44 views
49

Cách dễ nhất để thực hiện tương đương với rm -rf bằng Python là gì?Cách dễ nhất để rm-rf bằng Python

+0

có thể trùng lặp của [Làm thế nào để xóa/xóa thư mục đó không phải là trống rỗng với Python?] (Http: //stackoverflow.com/questions/303200/how-do-i-remove-delete-a-folder-that-is-not-empty-with-python) –

Trả lời

60
import shutil 
shutil.rmtree("dir-you-want-to-remove") 
+17

Trong khi hữu ích, rmtree không tương đương: nó bị lỗi nếu bạn cố gắng xóa một tệp. –

+0

Để có câu hỏi "loại bỏ thư mục không trống" chung hơn, câu trả lời này sẽ phù hợp hơn: http://stackoverflow.com/questions/303200/how-do-i-remove-delete-a-folder-that -is-not-empty-with-python –

1

shutil.rmtree() là câu trả lời đúng, nhưng chỉ cần nhìn vào một chức năng hữu ích - os.walk()

30

Trong khi hữu ích, rmtree là không tương đương: nó lỗi ra nếu bạn cố gắng để loại bỏ một tệp duy nhất, trong đó rm -f không (xem ví dụ bên dưới).

Để giải quyết vấn đề này, bạn sẽ cần phải kiểm tra xem đường dẫn của bạn là tệp hay thư mục và hành động tương ứng. Một cái gì đó như thế này nên làm như lừa:

import os 
import shutil 

def rm_r(path): 
    if os.path.isdir(path) and not os.path.islink(path): 
     shutil.rmtree(path) 
    elif os.path.exists(path): 
     os.remove(path) 

Lưu ý: chức năng này sẽ không xử lý nhân vật hoặc chặn các thiết bị (mà sẽ yêu cầu sử dụng các mô-đun stat).

Ví dụ trong chênh lệch từ rm -f và Python của shutils.rmtree

$ mkdir rmtest 
$ cd rmtest/ 
$ echo "stuff" > myfile 
$ ls 
myfile 
$ rm -rf myfile 
$ ls 
$ echo "stuff" > myfile 
$ ls 
myfile 
$ python 
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) 
[GCC 4.5.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import shutil 
>>> shutil.rmtree('myfile') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/shutil.py", line 236, in rmtree 
    onerror(os.listdir, path, sys.exc_info()) 
    File "/usr/lib/python2.7/shutil.py", line 234, in rmtree 
    names = os.listdir(path) 
OSError: [Errno 20] Not a directory: 'myfile' 

Edit: xử lý liên kết tượng trưng; lưu ý các giới hạn theo nhận xét của @ pevik

+2

Phiên bản này không hoạt động trên các liên kết tượng trưng đến các thư mục như python trả về 'True' trên' os.path.isdir (symlink_to_directory) ' – pevik

+0

Bắt tốt, @pevik - sửa nó. Cảm ơn! –

1
import os 
import shutil 

def rm_r(path): 
    if not os.path.exists(path): 
     return 
    if os.path.isfile(path) or os.path.islink(path): 
     os.unlink(path) 
    else: 
     shutil.rmtree(path) 

Cải thiện đáng kể phiên bản Gabriel Grant. Điều này cũng hoạt động trên các liên kết đến các thư mục. Lưu ý: chức năng không không xử lý ký tự Un * x và các thiết bị khối (yêu cầu phải sử dụng mô-đun stat).

-6

Chỉ cần làm điều này:

import os 
dirname = "path_to_directory_to_remove" 
os.system("rm -rf %s" % dirname) 
+0

Downvote vì đây không thực sự là một python tương đương. – admdrew

+0

rm -rf sẽ chỉ hoạt động trên nền tảng * nix và không phải là mã python. – Prikkeldraad

+0

Nó cũng nguy hiểm vì nó không phải là thoát khỏi dirname. –

1

def Delite (filepath):

import os, stat, sys 
def intertwin(_list): 
    list1 = [] 
    for i in _list: 
     list1 += i 
    return list1 
allpath = os.walk(filepath) 
walk = [] 
dirs = [] 
path = [] 
allfiles = [] 
for i in allpath: 
    walk.append(i) 
for i in walk: 
    dirs.append(i[0]) 
for _dir in dirs: 
    os.chdir(_dir) 
    files = os.listdir(_dir) 
    files1 = [] 
    for i in files: 
     files1.append(_dir + '\\' + i) 
    files = files1[:] 
    allfiles.append(files) 
allfiles = intertwin(allfiles) 
for i in allfiles: 
    os.chmod(i, stat.S_IRWXU) 
allfiles.reverse() 
os.chdir(sys.path[0]) 
for i in allfiles: 
    try: 
     os.remove(i) 
    except: 
     try: 
      os.rmdir(i) 
     except: 
      pass 
os.chmod(filepath, stat.S_IRWXU) 
try: 
    os.remove(filepath) 
except: 
    os.rmdir(filepath) 
    allfiles.reverse() 
    os.chdir(sys.path[0]) 
    for i in allfiles: 
     try: 
      os.remove(i) 
     except: 
      try: 
       os.rmdir(i) 
      except: 
       pass 
    os.chmod(filepath, stat.S_IRWXU) 
    try: 
     os.remove(filepath) 
    except: 
     os.rmdir(filepath) 
+0

Удаляет папку с файлами или файл, даже если стоит атрибут "Только чтение" Xóa một thư mục với các tập tin hoặc một tập tin, ngay cả khi các thuộc tính "Read only" – Pogramist

+0

Trong tiếng Anh, xin vui lòng: _Deletes một thư mục với các tập tin hoặc một tập tin , ngay cả khi được gán cho "Chỉ đọc" _ – JosefZ

+0

Đó là dịch, tôi không biết tiếng Anh tốt)) – Pogramist

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