sourcecode

폴더 내용을 삭제하려면 어떻게 해야 합니까?

copyscript 2022. 9. 11. 17:28
반응형

폴더 내용을 삭제하려면 어떻게 해야 합니까?

Python에서 로컬 폴더 내용을 삭제하려면 어떻게 해야 하나요?

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

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))

간단하게 다음과 같이 할 수 있습니다.

import os
import glob

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

물론 경로 내의 다른 필터(예: /YOU/PATH/*.txt)를 사용하여 디렉토리 내의 모든 텍스트파일을 삭제할 수 있습니다.

다음 명령을 사용하여 폴더 자체와 폴더 내용을 모두 삭제할 수 있습니다.

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


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

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))

아무도 이 일을 할 수 있는 멋진 일에 대해 언급하지 않았다니 놀랍다.

디렉토리의 파일만 삭제하려면 해당 디렉토리가 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)

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

워크를 사용하여 제안된 솔루션은 사용 중인 솔루션과 같이 작동하지 않습니다.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)

이것은, 다음과 같습니다.

  • 모든 심볼릭링크를 삭제합니다.
    • 데드링크
    • 디렉토리 링크
    • 파일에 대한 링크
  • 서브 디렉토리를 삭제합니다.
  • 상위 디렉토리는 삭제되지 않습니다.

코드:

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

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

Python 3.6+에서 os.scandir컨텍스트 매니저 프로토콜을 사용하는 경우:

import os
import shutil

with os.scandir(target_dir) as entries:
    for entry in entries:
        if entry.is_dir() and not entry.is_symlink():
            shutil.rmtree(entry.path)
        else:
            os.remove(entry.path)

이전 버전의 Python:

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
[shutil.rmtree(i) if os.path.isdir(i) and not os.path.islink(i) else os.remove(i) for i in contents]

메모: 만약 누군가가 제 답변을 거부했을 경우, 저는 여기서 설명할 것이 있습니다.

  1. 누구나 짧은 'n'의 간단한 답변을 좋아합니다.하지만, 때때로 현실은 그렇게 간단하지 않다.
  2. 내 대답으로 돌아가자.는 알고 있다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")

온라인 라이너로서:

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)) )

저는 이런 식으로 문제를 해결하곤 했습니다.

import shutil
import os

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

폴더 자체를 삭제하지 않고 디렉토리내의 모든 파일과 그 서브 디렉토리를 삭제하려면 , 다음의 순서에 따릅니다.

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))

사용하는 폴더 내의 모든 파일을 삭제하려면:

import os
for i in os.listdir():
    os.remove(i)

하는 게 것 요.os.walk()이걸 위해서.

os.listdir()는, 파일과 디렉토리를 구별하지 않기 때문에, 이러한 링크를 해제하려고 하면 곧바로 문제가 발생합니다.를 사용하는 좋은 예가 있습니다.os.walk()여기서 디렉토리를 재귀적으로 삭제하고, 그 디렉토리를 환경에 적응시키는 방법에 대해 설명합니다.

*nix 시스템을 사용하는 경우 system 명령을 활용하는 것이 어떻습니까?

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 sh
sh.rm(sh.glob('/path/to/folder/*'))

오래된 스레드인 것은 알고 있습니다만, 파이썬 공식 사이트에서 흥미로운 것을 발견했습니다.디렉토리의 모든 컨텐츠를 삭제하기 위한 다른 아이디어를 공유하기 위해서입니다.왜냐하면 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))

음, 이 코드가 효과가 있는 것 같아요.폴더는 삭제되지 않으며 이 코드를 사용하여 특정 확장자를 가진 파일을 삭제할 수 있습니다.

import os
import glob

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

매우 직관적인 방법:

import shutil, os


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


remove_folder_contents('/path/to/folder')

디렉토리 자체가 아닌 디렉토리의 내용을 삭제하려면 , 다음의 방법을 사용합니다.

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

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)

주제에서 약간 벗어난 것 같지만, 많은 사람들이 유용하다고 생각할 겁니다

는 그 를 제 i로 했다.rmtree makedirs「」를 추가해 .time.sleep()★★★★

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

time.sleep(.5)

os.makedirs(folder_location, 0o777)

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

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

OS 모듈을 사용하여 목록을 표시하고 삭제하기만 하면 됩니다.

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

나에겐 효과가 있었어, 문제가 있으면 알려줘!

언급URL : https://stackoverflow.com/questions/185936/how-to-delete-the-contents-of-a-folder

반응형