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


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.