폴더의 내용을 삭제하는 방법?


468

파이썬에서 로컬 폴더의 내용을 어떻게 삭제합니까?

현재 프로젝트는 Windows 용이지만 * nix도보고 싶습니다.


2
* nix가 정직하게 말하면 그냥 사용할 것입니다os.system('rm -rf folder')
— Tilak Maddy

답변:


441
import os, shutil
folder = '/path/to/folder'
for filename in os.listdir(folder):
    file_path = os.path.join(folder, filename)
    try:
        if os.path.isfile(file_path) or os.path.islink(file_path):
            os.unlink(file_path)
        elif os.path.isdir(file_path):
            shutil.rmtree(file_path)
    except Exception as e:
        print('Failed to delete %s. Reason: %s' % (file_path, e))

4
매우 큰 디렉토리, 특히 Windows의 네트워크 디렉토리로 작업하고이 프로그램이 실행되는 환경을 제어 할 수있는 경우 Py3.5의 "os.scandir (폴더)"기능을 대신 사용하는 것이 좋습니다 listdir. 그 구문은 그 이후에는 상당히 다르지만 구현하기는 매우 간단합니다. 다른 사람들이 원한다면 게시 해 드리겠습니다.
— Michael Scott Cuthbert

except Exception as e:읽은 pylint 경고가 나타납니다 W0703: Catching too general exception Exception. 잡을 좀 더 구체적인 예외가 있습니까, 아니면 무시해야합니까?
— John Hany

7
@ JohnHany, OSError를 잡기를 원합니다.
— MikeB

246

당신은 단순히 이것을 할 수 있습니다 :

import os
import glob

files = glob.glob('/YOUR/PATH/*')
for f in files:
    os.remove(f)

디렉토리의 모든 텍스트 파일을 제거하기 위해 경로에 다른 필터를 사용할 수도 있습니다 (예 : /YOU/PATH/*.txt).


12
@Blueicefield *는 숨겨진 파일을 나열하지 않습니다. 또한 다음을 추가해야합니다.glob.glob('path/.*)
— satoru

5
파일 목록을 삭제할 수 있지만, 어떻게 나에게 간단 같다 :import sh; sh.rm(files)
— 로빈 윈 슬로

2
동안 import sh; sh.rm(files)봐 예뻐을 수행하는 디렉토리에있는 1024 개 이상의 파일이있는 경우, 당신은 문제로 실행합니다.
— Eugene

235

다음을 사용하여 폴더 자체와 모든 내용을 삭제할 수 있습니다 shutil.rmtree.

import shutil
shutil.rmtree('/path/to/folder')
shutil.rmtree(path, ignore_errors=False, onerror=None)


전체 디렉토리 트리를 삭제하십시오. 경로 는 디렉토리를 가리켜 야합니다 (디렉토리에 대한 심볼릭 링크는 아님). 경우 ignore_errors는 사실, 실패 제거로 인한 오류는 무시됩니다; false이거나 생략 된 경우, 이러한 오류는 onerror에 의해 지정된 핸들러를 호출하여 처리 되거나 생략되면 예외를 발생시킵니다.


270
이것은 내용뿐만 아니라 폴더 자체도 삭제합니다. 나는 그것이 질문이하는 것이라고 생각하지 않습니다.
— 이케르 지 메네즈

3
좋은 대답이라고 생각합니다. 내용과 폴더를 삭제 한 다음 폴더를 다시 만드십시오.
— cssndrx

42
새 디렉토리와 이전 디렉토리는 같지 않기 때문입니다. 따라서 프로그램이 디렉토리에 앉아 물건을 기다리는 경우, 그 아래에서 깔개를 뽑을 것입니다.
— Mike Cooper

30
다음에 디렉토리를 다시 만드십시오 rmtree. 처럼os.makedirs(dir)
— Iulius Curt

3
@IuliusCurt 아니오, 램에 마운트 된 디렉토리가 비어 있습니다. 불행히도 삭제하고 다시 만들 수는 없습니다.OSError: [Errno 16] Device or resource busy
— Arnaud P

80

mhawke의 답변을 확장하면 이것이 내가 구현 한 것입니다. 폴더 자체가 아닌 폴더의 모든 내용을 제거합니다. 파일, 폴더 및 심볼릭 링크를 사용하여 Linux에서 테스트하면 Windows에서도 작동합니다.

import os
import shutil

for root, dirs, files in os.walk('/path/to/folder'):
    for f in files:
        os.unlink(os.path.join(root, f))
    for d in dirs:
        shutil.rmtree(os.path.join(root, d))

1
폴더 내용 만 나열하는 것이 아니라 왜 '보행'합니까?
— Don

2
디렉토리를 삭제하려는 경우에도 정답입니다. walkdirs와 파일을 분리하는 데 사용되며 다르게 처리해야합니다. 을 사용할 수도 os.listdir있지만 각 항목이 dir 또는 파일인지 수동으로 확인해야합니다.
— dkamins 2016 년

7
이것은 가깝지만 os.walk와 shutil.rmtree는 재귀 적입니다. os.walk는 정리할 디렉토리 내부의 최상위 레벨에있는 파일과 디렉토리 만 필요하므로 필요하지 않습니다. os.listdir의 요소에 if 문을 사용하여 각각 파일 또는 디렉토리인지 확인하십시오. 그런 다음 remove / unlink 및 rmtree를 각각 사용하십시오.
— Matthew Alpert

1
그러나 @MatthewAlpert 참고로, os.walk여기에서는 되풀이 되지 않습니다. 생성기를 반환하려고 할 때만 하위 디렉토리를 재귀 적으로 살펴보고 생성기를 반환하기 때문에이 루프의 첫 번째 반복을 수행 할 때 하위 디렉토리가 없습니다. 보고 왼쪽. 본질적 os.walk으로 최상위 폴더와 최상위 파일을 구별하는 대체 방법으로 여기에서 사용되고 있습니다. 재귀는 사용되지 않으며 성능 비용을 지불하지 않습니다. 그러나 편 심적이며, 나는 당신이 제안하는 접근 방식이 더 명확하고 읽기 쉽기 때문에 더 낫다는 데 동의합니다.
— Mark Amery 14

47

rmtree폴더를 사용 하고 다시 만들면 작동 할 수 있지만 네트워크 드라이브에서 폴더를 삭제하고 즉시 다시 만들 때 오류가 발생했습니다.

walk를 사용하여 제안 된 솔루션은 rmtree폴더를 제거 하는 데 사용되지 않으며 os.unlink이전에 해당 폴더에 있던 파일 에서 사용하려고 시도 할 수 있습니다 . 오류가 발생합니다.

게시 된 glob솔루션은 비어 있지 않은 폴더를 삭제하려고 시도하여 오류가 발생합니다.

나는 당신이 사용하는 것이 좋습니다 :

folder_path = '/path/to/folder'
for file_object in os.listdir(folder_path):
    file_object_path = os.path.join(folder_path, file_object)
    if os.path.isfile(file_object_path) or os.path.islink(file_object_path):
        os.unlink(file_object_path)
    else:
        shutil.rmtree(file_object_path)

1
다른 디렉토리에 대한 심볼릭 링크가 있으면 솔루션에서 오류가 발생합니다.
— Blueicefield

@Blueicefield-예제를 제공 할 수 있습니까? 리눅스에서 심볼릭 파일과 폴더를 사용하여 테스트했지만 아직 오류가 발생하지 않았습니다.
— jgoeders 2014 년

@jgoeders-디렉토리에 대한 심볼릭 링크가 있으면 (심볼릭 링크를 따르기 때문에) os.path.isfile()리턴 하고 심볼릭 링크를 False호출 shutil.rmtree()하면 결과가 발생 OSError("Cannot call rmtree on a symbolic link")합니다.
— Rockallite

1
@Rockallite islink로 확인하여 수정 됨
— kevinf

1
또한 @kevinf는 islink디렉토리에 대한 심볼릭 링크를 올바르게 처리하기 위해 여기에서 확인 해야 할 필요성을 지적 합니다. 허용 된 답변에 그러한 확인을 추가했습니다.
— Mark Amery

20

이:

  • 모든 심볼릭 링크를 제거합니다
    • 죽은 링크
    • 디렉토리 링크
    • 파일 링크
  • 하위 디렉토리를 제거합니다
  • 부모 디렉토리를 제거하지 않습니다

암호:

for filename in os.listdir(dirpath):
    filepath = os.path.join(dirpath, filename)
    try:
        shutil.rmtree(filepath)
    except OSError:
        os.remove(filepath)

다른 많은 답변과 마찬가지로 파일 / 디렉토리를 제거 할 수 있도록 권한을 조정하지 않습니다.


15

원 라이너로서 :

import os

# Python 2.7
map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) )

# Python 3+
list( map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) ) )

파일과 디렉토리에 대한보다 강력한 솔루션 계정은 (2.7)입니다.

def rm(f):
    if os.path.isdir(f): return os.rmdir(f)
    if os.path.isfile(f): return os.unlink(f)
    raise TypeError, 'must be either file or directory'

map( rm, (os.path.join( mydir,f) for f in os.listdir(mydir)) )

1
발전기를 사용하는 대규모 작업의 경우 훨씬 효율적일 수 있습니다.map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) )
— user25064

실제로 이것을 사용하려고하면 map 객체가 반복되어야한다는 것을 깨달았습니다. 그래서리스트 호출 (또는 반복 될 것)은list(map(os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir))))
— user25064

첫 번째는 대답에 포함되어 있고 두 번째는 나에게 의미가 없습니다. iterable에 매핑 된 함수를 반복해야하는 이유는 무엇입니까? 지도는 그렇게합니다.
— fmonegaglia

1
Python3, 당신은 포장 할 필요가 map있는 list 사실을 반복. 참조 http://stackoverflow.com/questions/1303347/getting-a-map-to-return-a-list-in-python-3-x을
— paulwasit

unlink는 파일에 대해서만 작동하므로 'mydir'에 하나 이상의 폴더가 포함되어 있으면이 기능이 제대로 작동하지 않습니다.
— kupsef

14

메모 : 누군가 내 대답에 투표를 한 경우 여기에 설명 할 것이 있습니다.

  1. 누구나 짧은 'n'간단한 답변을 좋아합니다. 그러나 때로는 현실이 그렇게 간단하지 않습니다.
  2. 내 대답으로 돌아 가기 shutil.rmtree()디렉토리 트리를 삭제하는 데 사용할 수 있다는 것을 알고 있습니다. 내 프로젝트에서 여러 번 사용했습니다. 그러나 디렉토리 자체도에 의해 삭제됨을 알아야합니다shutil.rmtree() . 일부 사용자에게는 허용 될 수 있지만 폴더의 내용 을 삭제하는 데에는 부작용이없는 올바른 답변이 아닙니다 .
  3. 부작용의 예를 보여 드리겠습니다. 내용이 많은 사용자 정의 된 소유자 및 모드 비트 가있는 디렉토리가 있다고 가정하십시오 . 그런 다음로 삭제 shutil.rmtree()하고 다시 빌드하십시오 os.mkdir(). 그리고 기본 (상속 된) 소유자 및 모드 비트 가있는 빈 디렉토리가 나타납니다 . 컨텐츠 및 디렉토리를 삭제할 권한이있을 수 있지만 디렉토리에서 원래 소유자 및 모드 비트를 다시 설정하지 못할 수 있습니다 (예 : 수퍼 유저가 아님).
  4. 마지막으로 인내심을 갖고 코드를 읽으십시오 . 길고 못 생겼지 만 (시각적으로) 신뢰할 수 있고 효율적 (사용 중)으로 입증되었습니다.

길고 추악하지만 신뢰할 수 있고 효율적인 솔루션입니다.

다른 응답자가 해결하지 않은 몇 가지 문제를 해결합니다.

  • 그것은 심볼릭 링크를 호출하지 않는 것을 포함하여 심볼릭 링크를 올바르게 처리 shutil.rmtree()합니다 ( os.path.isdir()디렉토리에 링크되면 테스트 를 통과합니다 . 심지어 os.walk()링크 된 디렉토리도 포함합니다).
  • 읽기 전용 파일을 잘 처리합니다.

코드는 다음과 같습니다 (유일한 유용한 기능은 clear_dir()).

import os
import stat
import shutil


# http://stackoverflow.com/questions/1889597/deleting-directory-in-python
def _remove_readonly(fn, path_, excinfo):
    # Handle read-only files and directories
    if fn is os.rmdir:
        os.chmod(path_, stat.S_IWRITE)
        os.rmdir(path_)
    elif fn is os.remove:
        os.lchmod(path_, stat.S_IWRITE)
        os.remove(path_)


def force_remove_file_or_symlink(path_):
    try:
        os.remove(path_)
    except OSError:
        os.lchmod(path_, stat.S_IWRITE)
        os.remove(path_)


# Code from shutil.rmtree()
def is_regular_dir(path_):
    try:
        mode = os.lstat(path_).st_mode
    except os.error:
        mode = 0
    return stat.S_ISDIR(mode)


def clear_dir(path_):
    if is_regular_dir(path_):
        # Given path is a directory, clear its content
        for name in os.listdir(path_):
            fullpath = os.path.join(path_, name)
            if is_regular_dir(fullpath):
                shutil.rmtree(fullpath, onerror=_remove_readonly)
            else:
                force_remove_file_or_symlink(fullpath)
    else:
        # Given path is a file or a symlink.
        # Raise an exception here to avoid accidentally clearing the content
        # of a symbolic linked directory.
        raise OSError("Cannot call clear_dir() on a symbolic link")

파일 모드를 변경하는 컨텍스트가 어떤 의미인지 이해하지 못합니다. 내 Mac의 경우 os.remove, 달리rm 유틸리티, 당신이 그들을 자신의 장기로 읽기 전용 파일을 삭제하는 것이 행복하다. 한편, 읽기 전용으로 만 액세스 할 수 있는 파일이 자신이 소유 하지 않은 파일 인 경우 파일을 삭제 하거나 권한을 변경할 수 없습니다. 읽기 전용 파일을 삭제할 os.remove수 는 없지만 사용 권한을 변경할 수 있는 시스템의 상황 은 없습니다. 또한 lchmod내 Mac에는 존재하지 않거나 문서에 따라 Windows 에는을 사용 하지 않습니다. 이 코드는 어떤 플랫폼을위한 것입니까?!
— Mark Amery

14

나는 아무도이 일을하는 것을 언급 한 것에 놀랐 pathlib습니다.

디렉토리에서 파일 만 제거하려면 oneliner가 될 수 있습니다.

from pathlib import Path

[f.unlink() for f in Path("/path/to/folder").glob("*") if f.is_file()] 

디렉토리를 재귀 적으로 제거하려면 다음과 같이 작성할 수 있습니다.

from pathlib import Path
from shutil import rmtree

for path in Path("/path/to/folder").glob("**/*"):
    if path.is_file():
        path.unlink()
    elif path.is_dir():
        rmtree(path)

1
.iterdir()대신 .glob(...)작동해야합니다.
— S. Kirby

11
import os
import shutil

# Gather directory contents
contents = [os.path.join(target_dir, i) for i in os.listdir(target_dir)]

# Iterate and remove each item in the appropriate manner
[os.remove(i) if os.path.isfile(i) or os.path.islink(i) else shutil.rmtree(i) for i in contents]

이전 의견에서는 Python 3.5 이상에서 os.scandir 사용에 대해 언급했습니다. 예를 들면 다음과 같습니다.

import os
import shutil

with os.scandir(target_dir) as entries:
    for entry in entries:
        if entry.is_file() or entry.is_symlink():
            os.remove(entry.path)
        elif entry.is_dir():
            shutil.rmtree(entry.path)

1
os.path.isdir()일반 디렉토리와 기호 링크를 구별하는 올바른 방법이 아닙니다. shutil.rmtree()심볼릭 링크를 호출 하면 OSError예외가 발생합니다.
— Rockallite

@Rockallite 감사합니다. 네가 옳아. 예제를 업데이트했습니다.
— Jacob Wan

8

os.walk()이것을 사용 하는 것이 좋습니다 .

os.listdir()파일을 디렉토리와 구별하지 않으므로 링크를 해제하려고 시도하는 데 어려움이 있습니다. hereos.walk() 디렉토리를 재귀 적으로 제거하는 데 사용하는 좋은 예가 있으며 , 상황에 맞게 디렉토리 를 조정하는 방법에 대한 힌트를 제공합니다.


6

이런 식으로 문제를 해결하는 데 사용했습니다.

import shutil
import os

shutil.rmtree(dirpath)
os.mkdir(dirpath)

7
이것은 질문이 요구하는 것과 근본적으로 다른 의미를 가지며 유효한 답변으로 간주되어서는 안됩니다.
— fatuhoku

1
"로컬 폴더의 내용 삭제"는 폴더 자체를 제거하는 것과 관련이 없다고 생각합니다. 이 답변 과 동일한 문제입니다 . 단 하나의 공감대가 많이 있습니다!
— fatuhoku

3
"파이썬에서 함수가 숫자 1을 어떻게 반환합니까?"라는 질문에 답하는 것과 같습니다. def return_a_one () 포함 : launch_some_nukes () return 1
— fatuhoku

2
물론 의미론은 다릅니다. 그러나 문제를 보는 다른 방법으로도 고려할 수 있습니다. 이 솔루션은 문제를 해결하므로 완벽하게 유효합니다. 'launch_some_nukes'예제와는 다른 점이 있습니다. 1. 솔루션이 허용되는 것보다 짧고 쉬우 며 인용 한 답변과는 반대입니다. 2.이 경우 'launch_some_nukes'는 폴더를 삭제하고 다시 작성하는 것입니다. 이전 폴더와 새 폴더의 차이점은 inode 번호 (OP와 관련이 없을 수도 있음)
— 일뿐입니다.

2
그것은 오히려 초고층 빌딩을 철거 한에게 정확히 같은 크기를 재 구축)
— ProfHase85

5

또 다른 해결책 :

import sh
sh.rm(sh.glob('/path/to/folder/*'))

1
참고 sh표준 라이브러리의 일부가 아닌 당신이 그것을 사용하기 전에 PyPI에서 설치해야합니다. 또한 이것은 실제로 rm서브 프로세스에서 호출하기 rm때문에 존재하지 않는 Windows에서는 작동하지 않습니다. 폴더에 하위 디렉토리가 포함되어 있으면 예외가 발생합니다.
— Mark Amery

5

나는 그것이 오래된 실이라고 생각했지만 파이썬의 공식 사이트에서 흥미로운 것을 발견했습니다. 디렉토리의 모든 내용을 제거하기위한 또 다른 아이디어를 공유하기위한 것입니다. shutil.rmtree ()를 사용할 때 인증에 문제가 있고 디렉토리를 제거하고 다시 만들고 싶지 않기 때문에. 원래 주소는 http://docs.python.org/2/library/os.html#os.walk 입니다. 그것이 누군가를 도울 수 있기를 바랍니다.

def emptydir(top):
    if(top == '/' or top == "\\"): return
    else:
        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))

4

폴더 자체를 제거하지 않고 디렉토리 내부의 모든 파일과 하위 디렉토리를 삭제하려면 다음과 같이하십시오.

import os
mypath = "my_folder" #Enter your path here
for root, dirs, files in os.walk(mypath):
    for file in files:
        os.remove(os.path.join(root, file))

3

* nix 시스템을 사용하는 경우 시스템 명령을 활용하지 않겠습니까?

import os
path = 'folder/to/clean'
os.system('rm -rf %s/*' % path)

3
질문에서 언급했듯이 "현재 프로젝트는 Windows 용입니다"
— Monica with Sox

3

매우 직관적 인 방법 :

import shutil, os


def remove_folder_contents(path):
    shutil.rmtree(path)
    os.makedirs(path)


remove_folder_contents('/path/to/folder')

3

글쎄, 나는이 코드가 작동하고 있다고 생각한다. 폴더는 삭제되지 않으며이 코드를 사용하여 특정 확장자를 가진 파일을 삭제할 수 있습니다.

import os
import glob

files = glob.glob(r'path/*')
for items in files:
    os.remove(items)

3

단일 상위 디렉토리 내의 3 개의 별도 폴더에서 파일을 제거해야했습니다.

directory
   folderA
      file1
   folderB
      file2
   folderC
      file3

이 간단한 코드는 나를 위해 속임수를 썼습니다 : (나는 유닉스에 있습니다)

import os
import glob

folders = glob.glob('./path/to/parentdir/*')
for fo in folders:
  file = glob.glob(f'{fo}/*')
  for f in file:
    os.remove(f)

도움이 되었기를 바랍니다.


1

다음 사이 rmtree makedirs에 추가 하여 문제를 해결했습니다 time.sleep().

if os.path.isdir(folder_location):
    shutil.rmtree(folder_location)

time.sleep(.5)

os.makedirs(folder_location, 0o777)

0

제한된 특정 상황에 대한 답 : 하위 폴더 트리를 유지하면서 파일을 삭제한다고 가정하면 순환 알고리즘을 사용할 수 있습니다.

import os

def recursively_remove_files(f):
    if os.path.isfile(f):
        os.unlink(f)
    elif os.path.isdir(f):
        for fi in os.listdir(f):
            recursively_remove_files(os.path.join(f, fi))

recursively_remove_files(my_directory)

주제가 약간 다르지만 많은 사람들이 유용하다고 생각합니다.


stackoverflow.com/a/54889532/1709587에os.walk 표시된 방식으로 사용 하면 디렉토리 구조를 그대로 유지하면서 모든 파일을 삭제하는 더 좋은 방법 일 수 있습니다.
— Mark Amery

-1

temp_dir삭제 한다고 가정하면 사용하는 한 줄 명령 os은 다음과 같습니다.

_ = [os.remove(os.path.join(save_dir,i)) for i in os.listdir(temp_dir)]

참고 : 이것은 파일을 삭제하기위한 1- 라이너입니다. 디렉토리를 삭제하지 않습니다.

도움이 되었기를 바랍니다. 감사.


-1

다음 방법을 사용하여 디렉토리 자체가 아닌 디렉토리의 내용을 제거하십시오.

import os
import shutil

def remove_contents(path):
    for c in os.listdir(path):
        full_path = os.path.join(path, c)
        if os.path.isfile(full_path):
            os.remove(full_path)
        else:
            shutil.rmtree(full_path)

@ FabioSpaghetti 부정적인
— Amir

감사합니다 Amir, 루트 디렉토리의 모든 하위 디렉토리에서 특정 폴더를 찾고 해당 폴더의 내용을 제거하는 솔루션을 찾고 있습니다
— FabioSpaghetti

이것은 당신이 이것을 게시하기 몇 년 전에 받아 들여진 답변에 아직 표시되지 않은 새로운 것을 추가하지 않습니다.
— Mark Amery

-1

폴더의 모든 파일을 삭제하거나 모든 파일을 제거하는 가장 쉬운 방법

import os
files = os.listdir(yourFilePath)
for f in files:
    os.remove(yourFilePath + f)

하위 디렉토리가 있으면 실패합니다.
— Mark Amery

-3

이것은 OS 모듈을 사용하여 나열하고 제거하는 트릭을 수행해야합니다!

import os
DIR = os.list('Folder')
for i in range(len(DIR)):
    os.remove('Folder'+chr(92)+i)

나를 위해 일한, 어떤 문제라도 알려주십시오!

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