[python] 파이썬으로 비어 있지 않은 폴더를 어떻게 제거 / 삭제합니까?


5 Answers

os.walk() 의 파이썬 문서 에서 :

# Delete everything reachable from the directory named in 'top',
# assuming there are no symbolic links.
# CAUTION:  This is dangerous!  For example, if top == '/', it
# could delete all your disk files.
import os
for root, dirs, files in os.walk(top, topdown=False):
    for name in files:
        os.remove(os.path.join(root, name))
    for name in dirs:
        os.rmdir(os.path.join(root, name))
Question

비어 있지 않은 폴더를 삭제하려고하면 '액세스가 거부되었습니다.'오류가 발생합니다. 내 시도에서 다음 명령을 사용했습니다 : os.remove("/folder_name") .

비어 있지 않은 폴더 / 디렉토리를 제거 / 삭제하는 가장 효과적인 방법은 무엇입니까?




확실하다면 전체 dir 트리를 지우고 dir의 내용에 관심이 없으면 전체 dir 트리를 크롤링하는 것은 어리 석다. 파이썬에서 기본 OS 명령을 호출하면됩니다. 더 빠르고 효율적이며 적은 메모리를 소비합니다.

RMDIR c:\blah /s /q 

또는 * nix

rm -rf /home/whatever 

파이썬에서는 코드가 다음과 같이 보입니다.

import sys
import os

mswindows = (sys.platform == "win32")

def getstatusoutput(cmd):
    """Return (status, output) of executing cmd in a shell."""
    if not mswindows:
        return commands.getstatusoutput(cmd)
    pipe = os.popen(cmd + ' 2>&1', 'r')
    text = pipe.read()
    sts = pipe.close()
    if sts is None: sts = 0
    if text[-1:] == '\n': text = text[:-1]
    return sts, text


def deleteDir(path):
    """deletes the path entirely"""
    if mswindows: 
        cmd = "RMDIR "+ path +" /s /q"
    else:
        cmd = "rm -rf "+path
    result = getstatusoutput(cmd)
    if(result[0]!=0):
        raise RuntimeError(result[1])



python 3.4에서 다음을 사용할 수 있습니다 :

import pathlib

def delete_folder(pth) :
    for sub in pth.iterdir() :
        if sub.is_dir() :
            delete_folder(sub)
        else :
            sub.unlink()
    pth.rmdir() # if you just want to delete dir content, remove this line

여기서 pthpathlib.Path 인스턴스입니다. 좋지만 가장 빠를 수는 없습니다.




shutil 모듈을 사용하고 싶지 않으면 os 모듈을 사용할 수 있습니다.

from os import listdir, rmdir, remove
for i in listdir(directoryToRemove):
    os.remove(os.path.join(directoryToRemove, i))
rmdir(directoryToRemove) # Now the directory is empty of files



docs.python.org :

이 예는 일부 파일에 읽기 전용 비트가 설정된 Windows에서 디렉토리 트리를 제거하는 방법을 보여줍니다. onerror 콜백을 사용하여 읽기 전용 비트를 지우고 제거를 다시 시도합니다. 이후의 실패는 전파됩니다.

import os, stat
import shutil

def remove_readonly(func, path, _):
    "Clear the readonly bit and reattempt the removal"
    os.chmod(path, stat.S_IWRITE)
    func(path)

shutil.rmtree(directory, onerror=remove_readonly)



폴더가 존재하지 않을지라도 ( Charles Chow의 응답 에서 경쟁 조건을 피하면서), 다른 것들이 잘못되었을 때 (예 : 권한 문제, 디스크 읽기 오류, 파일이 디렉토리가 아님) 오류가 발생하더라도 삭제하십시오.

파이썬 3.x :

import shutil

def ignore_absent_file(func, path, exc_inf):
    except_instance = exc_inf[1]
    if isinstance(except_instance, FileNotFoundError):
        return
    raise except_instance

shutil.rmtree(dir_to_delete, onerror=ignore_absent_file)

Python 2.7 코드는 거의 동일합니다.

import shutil
import errno

def ignore_absent_file(func, path, exc_inf):
    except_instance = exc_inf[1]
    if isinstance(except_instance, OSError) and \
        except_instance.errno == errno.ENOENT:
        return
    raise except_instance

shutil.rmtree(dir_to_delete, onerror=ignore_absent_file)



Related



Tags

python python   file