programing

PathLib에서 디렉터리를 재귀적으로 제거하시겠습니까?

lastmoon 2023. 7. 21. 21:51
반응형

PathLib에서 디렉터리를 재귀적으로 제거하시겠습니까?

PathLib 모듈에서 디렉터리와 해당 내용을 제거할 수 있는 방법이 있습니까?와 함께path.unlink()파일만 제거합니다.path.rmdir()디렉터리가 비어 있어야 합니다.한 번의 함수 호출로 할 수 있는 방법이 없나요?

이미 아시다시피, 유일한 두 사람은Path파일/디렉토리를 제거하는 방법은.unlink()그리고..rmdir()네가 원하는 것도 마찬가지야

Pathlib은 서로 다른 OS에 걸쳐 객체 지향 경로를 제공하는 모듈이며, 다양한 방법을 많이 사용하도록 의도된 것은 아닙니다.

이 라이브러리의 목적은 파일 시스템 경로와 사용자가 해당 경로에 대해 수행하는 일반적인 작업을 처리하기 위한 간단한 클래스 계층을 제공하는 것입니다.

디렉터리를 재귀적으로 제거하는 것과 같은 "비일반적인" 파일 시스템 변경사항은 서로 다른 모듈에 저장됩니다.디렉터리를 재귀적으로 제거하려면 다음을 사용해야 합니다.shutil모듈. (과 함께 작동합니다.Path예도 있습니다!)

import shutil
import pathlib
import os  # for checking results

print(os.listdir())
# ["a_directory", "foo.py", ...]

path = pathlib.Path("a_directory")

shutil.rmtree(path)
print(os.listdir())
# ["foo.py", ...]

다음은 완전한 구현입니다.

from pathlib import Path


def rm_tree(pth):
    pth = Path(pth)
    for child in pth.glob('*'):
        if child.is_file():
            child.unlink()
        else:
            rm_tree(child)
    pth.rmdir()

그렇지 않으면, 당신이 원한다면 이것을 시도할 수 있습니다.pathlib:

from pathlib import Path


def rm_tree(pth: Path):
    for child in pth.iterdir():
        if child.is_file():
            child.unlink()
        else:
            rm_tree(child)
    pth.rmdir()

rm_tree(your_path)

간편하고 효과적:

def rmtree(f: Path):
    if f.is_file():
        f.unlink()
    else:
        for child in f.iterdir():
            rmtree(child)
        f.rmdir()

pathlib3x를 사용할 수도 있습니다. Pathlib은 Python 3.10.a0을 작성한 날짜에 최신 Python 3.6 이상용 Python pathlib의 백포트와 다음과 같은 몇 가지 추가 기능을 제공합니다.rmtree

>>> python -m pip install pathlib3x

>>> import pathlib3x as pathlib

>>> my_path = pathlib.Path('c:/tmp/some_directory')
>>> my_path.rmtree(ignore_errors=True)


당신은 그것을 github 또는 PyPi에서 찾을 수 있습니다.


고지 사항:저는 pathlib3x 라이브러리의 저자입니다.

타사 라이브러리를 사용해도 괜찮다면 경로를 사용해 보십시오.API는 와 비슷하지만 디렉터리 트리를 재귀적으로 삭제하는 것을 포함한 몇 가지 추가 방법을 제공합니다.

def rm_rf(basedir):
    if isinstance(basedir,str): basedir = pathlib.Path(basedir)
    if not basedir.is_dir(): return
    for p in reversed(list(basedir.rglob("*"))):
        if p.is_file(): p.unlink()
        elif p.is_dir(): p.rmdir()
    basedir.rmdir()

언급URL : https://stackoverflow.com/questions/50186904/pathlib-recursively-remove-directory

반응형