답변:
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))
except Exception as e:
읽은 pylint 경고가 나타납니다 W0703: Catching too general exception Exception
. 잡을 좀 더 구체적인 예외가 있습니까, 아니면 무시해야합니까?
당신은 단순히 이것을 할 수 있습니다 :
import os
import glob
files = glob.glob('/YOUR/PATH/*')
for f in files:
os.remove(f)
디렉토리의 모든 텍스트 파일을 제거하기 위해 경로에 다른 필터를 사용할 수도 있습니다 (예 : /YOU/PATH/*.txt).
*
는 숨겨진 파일을 나열하지 않습니다. 또한 다음을 추가해야합니다.glob.glob('path/.*)
import sh; sh.rm(files)
import sh; sh.rm(files)
봐 예뻐을 수행하는 디렉토리에있는 1024 개 이상의 파일이있는 경우, 당신은 문제로 실행합니다.
다음을 사용하여 폴더 자체와 모든 내용을 삭제할 수 있습니다 shutil.rmtree
.
import shutil
shutil.rmtree('/path/to/folder')
shutil.rmtree(path, ignore_errors=False, onerror=None)
전체 디렉토리 트리를 삭제하십시오. 경로 는 디렉토리를 가리켜 야합니다 (디렉토리에 대한 심볼릭 링크는 아님). 경우 ignore_errors는 사실, 실패 제거로 인한 오류는 무시됩니다; false이거나 생략 된 경우, 이러한 오류는 onerror에 의해 지정된 핸들러를 호출하여 처리 되거나 생략되면 예외를 발생시킵니다.
rmtree
. 처럼os.makedirs(dir)
OSError: [Errno 16] Device or resource busy
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))
walk
dirs와 파일을 분리하는 데 사용되며 다르게 처리해야합니다. 을 사용할 수도 os.listdir
있지만 각 항목이 dir 또는 파일인지 수동으로 확인해야합니다.
os.walk
여기에서는 되풀이 되지 않습니다. 생성기를 반환하려고 할 때만 하위 디렉토리를 재귀 적으로 살펴보고 생성기를 반환하기 때문에이 루프의 첫 번째 반복을 수행 할 때 하위 디렉토리가 없습니다. 보고 왼쪽. 본질적 os.walk
으로 최상위 폴더와 최상위 파일을 구별하는 대체 방법으로 여기에서 사용되고 있습니다. 재귀는 사용되지 않으며 성능 비용을 지불하지 않습니다. 그러나 편 심적이며, 나는 당신이 제안하는 접근 방식이 더 명확하고 읽기 쉽기 때문에 더 낫다는 데 동의합니다.
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)
os.path.isfile()
리턴 하고 심볼릭 링크를 False
호출 shutil.rmtree()
하면 결과가 발생 OSError("Cannot call rmtree on a symbolic link")
합니다.
islink
디렉토리에 대한 심볼릭 링크를 올바르게 처리하기 위해 여기에서 확인 해야 할 필요성을 지적 합니다. 허용 된 답변에 그러한 확인을 추가했습니다.
원 라이너로서 :
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)) )
map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) )
list(map(os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir))))
map
있는 list
사실을 반복. 참조 http://stackoverflow.com/questions/1303347/getting-a-map-to-return-a-list-in-python-3-x을
메모 : 누군가 내 대답에 투표를 한 경우 여기에 설명 할 것이 있습니다.
shutil.rmtree()
디렉토리 트리를 삭제하는 데 사용할 수 있다는 것을 알고 있습니다. 내 프로젝트에서 여러 번 사용했습니다. 그러나 디렉토리 자체도에 의해 삭제됨을 알아야합니다shutil.rmtree()
. 일부 사용자에게는 허용 될 수 있지만 폴더의 내용 을 삭제하는 데에는 부작용이없는 올바른 답변이 아닙니다 .shutil.rmtree()
하고 다시 빌드하십시오 os.mkdir()
. 그리고 기본 (상속 된) 소유자 및 모드 비트 가있는 빈 디렉토리가 나타납니다 . 컨텐츠 및 디렉토리를 삭제할 권한이있을 수 있지만 디렉토리에서 원래 소유자 및 모드 비트를 다시 설정하지 못할 수 있습니다 (예 : 수퍼 유저가 아님).길고 추악하지만 신뢰할 수 있고 효율적인 솔루션입니다.
다른 응답자가 해결하지 않은 몇 가지 문제를 해결합니다.
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")
os.remove
, 달리rm
유틸리티, 당신이 그들을 자신의 장기로 읽기 전용 파일을 삭제하는 것이 행복하다. 한편, 읽기 전용으로 만 액세스 할 수 있는 파일이 자신이 소유 하지 않은 파일 인 경우 파일을 삭제 하거나 권한을 변경할 수 없습니다. 읽기 전용 파일을 삭제할 os.remove
수 는 없지만 사용 권한을 변경할 수 있는 시스템의 상황 은 없습니다. 또한 lchmod
내 Mac에는 존재하지 않거나 문서에 따라 Windows 에는을 사용 하지 않습니다. 이 코드는 어떤 플랫폼을위한 것입니까?!
나는 아무도이 일을하는 것을 언급 한 것에 놀랐 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)
.iterdir()
대신 .glob(...)
작동해야합니다.
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)
os.path.isdir()
일반 디렉토리와 기호 링크를 구별하는 올바른 방법이 아닙니다. shutil.rmtree()
심볼릭 링크를 호출 하면 OSError
예외가 발생합니다.
이런 식으로 문제를 해결하는 데 사용했습니다.
import shutil
import os
shutil.rmtree(dirpath)
os.mkdir(dirpath)
또 다른 해결책 :
import sh
sh.rm(sh.glob('/path/to/folder/*'))
sh
표준 라이브러리의 일부가 아닌 당신이 그것을 사용하기 전에 PyPI에서 설치해야합니다. 또한 이것은 실제로 rm
서브 프로세스에서 호출하기 rm
때문에 존재하지 않는 Windows에서는 작동하지 않습니다. 폴더에 하위 디렉토리가 포함되어 있으면 예외가 발생합니다.
나는 그것이 오래된 실이라고 생각했지만 파이썬의 공식 사이트에서 흥미로운 것을 발견했습니다. 디렉토리의 모든 내용을 제거하기위한 또 다른 아이디어를 공유하기위한 것입니다. 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))
* nix 시스템을 사용하는 경우 시스템 명령을 활용하지 않겠습니까?
import os
path = 'folder/to/clean'
os.system('rm -rf %s/*' % path)
단일 상위 디렉토리 내의 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)
도움이 되었기를 바랍니다.
제한된 특정 상황에 대한 답 : 하위 폴더 트리를 유지하면서 파일을 삭제한다고 가정하면 순환 알고리즘을 사용할 수 있습니다.
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)
주제가 약간 다르지만 많은 사람들이 유용하다고 생각합니다.
os.walk
표시된 방식으로 사용 하면 디렉토리 구조를 그대로 유지하면서 모든 파일을 삭제하는 더 좋은 방법 일 수 있습니다.
다음 방법을 사용하여 디렉토리 자체가 아닌 디렉토리의 내용을 제거하십시오.
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)
폴더의 모든 파일을 삭제하거나 모든 파일을 제거하는 가장 쉬운 방법
import os
files = os.listdir(yourFilePath)
for f in files:
os.remove(yourFilePath + f)
os.system('rm -rf folder')