파이썬에서 폴더를 재귀 적으로 삭제


202

빈 디렉토리를 삭제하는 데 문제가 있습니다. 내 코드는 다음과 같습니다.

for dirpath, dirnames, filenames in os.walk(dir_to_search):
    //other codes

    try:
        os.rmdir(dirpath)
    except OSError as ex:
        print(ex)

논쟁 dir_to_search은 내가 작업을 수행 해야하는 디렉토리를 전달하는 곳입니다. 해당 디렉토리는 다음과 같습니다.

test/20/...
test/22/...
test/25/...
test/26/...

위의 모든 폴더는 비어 있습니다. 나는이 스크립트를 폴더를 실행하면 20, 25혼자 삭제됩니다! 그러나 폴더 25와는 26비어 폴더에도 불구하고, 삭제되지 않습니다.

편집하다:

내가 얻는 예외는 다음과 같습니다.

[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/29'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/29/tmp'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/28'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/28/tmp'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/26'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/25'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/27'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/27/tmp'

어디에서 실수를합니까?


1
숨겨진 파일이 없습니까?
Jeff

예외 또는 역 추적이 인쇄됩니까? 그렇다면-질문에 추가하면 도움이 될 것입니다
Ngure Nyaga

@Jeff : 네 확실합니다. 사실 내 우분투 컴퓨터 rmdir /path/to/25th/folder에서 전체 디렉토리를 삭제하는 것입니다. 이것은 디렉토리가 비어있는 것을 의미합니다!
sriram

답변:


392

시도 shutil.rmtree:

import shutil
shutil.rmtree('/path/to/your/dir/')

5
는 않습니다 rmtree전체 디렉토리를 삭제? 나는 그것이 하나와 비슷하다고 생각합니다rm -Rf $DIR
sriram

7
rmtree도 파일을 삭제하므로주의하십시오. 질문에 따르면, 질문은 EMPTY 디렉토리를 삭제하는 방법이었습니다. os.walk 문서는이 질문과 거의 일치하는 예제를 제공합니다. import os for root, dirs, files in os.walk(top, topdown=False): for name in dirs: os.rmdir(os.path.join(root, name))
DaveSawyer


27

기본 동작은 os.walk()루트에서 리프로 이동하는 것입니다. 설정 topdown=False에서 os.walk()루트 잎에서 걷는.


18

내 순수한 pathlib재귀 디렉토리 unlinker는 다음과 같습니다 .

from pathlib import Path

def rmdir(directory):
    directory = Path(directory)
    for item in directory.iterdir():
        if item.is_dir():
            rmdir(item)
        else:
            item.unlink()
    directory.rmdir()

rmdir(Path("dir/"))

12

시도 rmtree()에서 shutil파이썬 표준 라이브러리에서


1
는 않습니다 rmtree전체 디렉토리를 삭제? 나는 그것이 하나와 비슷하다고 생각합니다rm -Rf $DIR
sriram

2
docs : "전체 디렉토리 트리를 삭제합니다. 경로는 디렉토리를 가리켜 야합니다 (디렉토리에 대한 심볼릭 링크는 아님). ignore_errors가 true 인 경우 제거 실패로 인한 오류는 무시됩니다. false 또는 생략 된 경우 이러한 오류가 처리됩니다. "onerror에 의해 지정된 핸들러를 호출함으로써, 또는 그것이 생략되면 예외를 발생시킵니다."
microo8

7

절대 경로를 사용하고 rmtree 함수 from shutil import rmtree 만 가져 오는 것이 좋습니다. 위의 행은 필요한 함수 만 가져옵니다.

from shutil import rmtree
rmtree('directory-absolute-path')

1
그런 다음 이것을 이것을 rmtree(); 아닙니다shutil.rmtree()
Kevin Murphy

4

다음에 마이크로 파이썬 솔루션을 검색하는 사람은 os (listdir, remove, rmdir)를 기반으로합니다. 완전하지 않거나 (특히 오류 처리에서) 화려하지는 않지만 대부분의 상황에서 작동합니다.

def deltree(target):
    print("deltree", target)
    for d in os.listdir(target):
        try:
            deltree(target + '/' + d)
        except OSError:
            os.remove(target + '/' + d)

    os.rmdir(target)

3

Tomek에서 제공 한 명령 은 파일이 읽기 전용 인 경우 파일을 삭제할 수 없습니다 . 따라서 사용할 수 있습니다-

import os, sys
import stat

def del_evenReadonly(action, name, exc):
    os.chmod(name, stat.S_IWRITE)
    os.remove(name)

if  os.path.exists("test/qt_env"):
    shutil.rmtree('test/qt_env',onerror=del_evenReadonly)

2
내 자신의 폴더로 코드를 삭제하려고하면 다음과 같은 오류가 발생 NameError: name 'stat' is not defined합니다. 어떻게 정의 되었습니까?
nnako

1
stat 모듈은 os.stat (), os.fstat () 및 os.lstat ()의 결과를 해석하기위한 상수 및 함수를 정의합니다. 당신이 시도 할 수있는 것 : 수입 수입, 통계 수입에서 sys * *
Monir

0

여기 또 다른 순수 pathlib 솔루션은 있지만 없는 재귀 :

from pathlib import Path
from typing import Union

def del_empty_dirs(base: Union[Path, str]):
    base = Path(base)
    for p in sorted(base.glob('**/*'), reverse=True):
        if p.is_dir():
            p.chmod(0o666)
            p.rmdir()
        else:
            raise RuntimeError(f'{p.parent} is not empty!')
    base.rmdir()

-1

재귀 솔루션은 다음과 같습니다.

def clear_folder(dir):
    if os.path.exists(dir):
        for the_file in os.listdir(dir):
            file_path = os.path.join(dir, the_file)
            try:
                if os.path.isfile(file_path):
                    os.unlink(file_path)
                else:
                    clear_folder(file_path)
                    os.rmdir(file_path)
            except Exception as e:
                print(e)

-1

Linux 사용자의 경우 간단히 pythonic 방식으로 shell 명령을 실행할 수 있습니다

import os
os.system("rm -r /home/user/folder_name")

여기서 rm의 약자 제거-r위해 재귀

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.