2009-05-02 5 views
49

Что является самым простым способом сделать эквивалент rm -rf в Python?Самый простой способ rm -rf в Python

+0

Возможный дубликат [Как удалить/удалить папку, которая не является пустым с Python?] (HTTP: //stackoverflow.com/questions/303200/how-do-i-remove-delete-a-folder-that-is-not-empty-with-python) –

ответ

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

Хотя полезно, rmtree не является эквивалентным: он выдает ошибку, если вы пытаетесь удалить один файл. –

+0

Для более общего вопроса «удалить непустую папку», где этот ответ будет лучше всего подходит, см. Http://stackoverflow.com/questions/303200/how-do-i-remove-delete-a-folder-that -is-not-empty-with-python –

1

shutil.rmtree() является правильным ответом, а просто посмотреть на другую полезную функцию - os.walk()

30

Хотя полезно, rmtree не эквивалентны: это ошибки, если вы пытаетесь удалить один файл, который rm -f не показывает (см. пример ниже).

Чтобы обойти это, вам нужно проверить, является ли ваш путь файлом или каталогом, и действовать соответствующим образом. Нечто подобное должно сделать трюк:

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) 

Примечание: эта функция не будет обрабатывать символьные или блочные устройства (что потребует использования stat модуля).

Пример в разнице между rm -f и Питона 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: ручка симлинки; примечание к примечанию @ pevik

+2

Эта версия не работает над символическими ссылками на каталоги, так как python возвращает 'True' на' os.path.isdir (symlink_to_directory) ' – pevik

+0

Хороший catch, @pevik - исправил его. Благодаря! –

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) 

Немного улучшена версия Габриэля Гранта. Это также работает с символическими ссылками на каталоги. Примечание: функция не ручка Un * x символьные и блочные устройства (для этого потребуется использовать модуль stat).

-6

Просто сделай это:

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

Downvote, потому что это не эквивалент питона. – admdrew

+0

rm -rf будет работать только на платформе * nix и не является кодом python. – Prikkeldraad

+0

Это также опасно, поскольку он не ускользает от dirname. –

1

Защиту Delite (путь_к_файлу):

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

Удаляет папку с файлами или файлом, даже если стоит атрибут «Только чтение» Удаляет папку с файлами или файлом, даже если атрибут «Только для чтения» – Pogramist

+0

На английском языке пожалуйста: _Добавляет папку с файлами или файлом , даже если атрибут «Только для чтения» _ – JosefZ

+0

Это был переводчик, я не знаю английского хорошо)) – Pogramist

Смежные вопросы