Python을 사용하여 디렉토리의 모든 파일 삭제


147

.bak디렉토리 의 확장자 를 가진 모든 파일을 삭제하고 싶습니다 . 파이썬에서 어떻게 할 수 있습니까?


5
@ slh2080 : "솔직한"게시는이 사이트에서하는 것이 아닙니다. 실제로 사용한 답변을 선택하고 확인 표시를 클릭하여 문제가 해결되었음을 나타냅니다.
S.Lott

1
죄송합니다. 내 실수를 지적 해 주셔서 감사합니다. 숙제가 아니라 여가 시간에 파이썬을 배우는 것입니다. 내가 사용한 답변을 클릭했지만 ghostdog74 응답을보기 전에였습니다.
slh2080

참고 : 전체 디렉토리 트리를 삭제하는 shutil.rmtree(path)데 사용할 수 있습니다.
jfs

답변:


270

경유 os.listdiros.remove:

import os

filelist = [ f for f in os.listdir(mydir) if f.endswith(".bak") ]
for f in filelist:
    os.remove(os.path.join(mydir, f))

또는 통해 glob.glob:

import glob, os, os.path

filelist = glob.glob(os.path.join(mydir, "*.bak"))
for f in filelist:
    os.remove(f)

올바른 디렉토리에 있어야하며 결국을 사용하십시오 os.chdir.


21
첫 번째 예는 중복 for 루프를 사용하는 것입니다. f.endswith ( ". bak")] 인 경우-[os.listdir ( "."에서 f의 경우 os.remove (f))-목록 이해를 사용하여 전달할 수 있습니다. 또는 이해의 'if'를 for 루프로 이동할 수 있습니다 (os.listdir ( "."의 경우 f) : if f.endswith ( ". bak") : os.remove (f)
dragonjujo

@ slh2080 문제가 해결되었다고 말하면 정답으로 답변을 표시해보십시오.
blwy10

5
os.listdir ( ".")을주의하십시오 !!! 나는이 코드를 사용하고 경로를 변경하는 것을 잊었다. 내 코드는 모두 사라졌다! 두 가지 유틸리티를 사용해 보았지만 운이 없었습니다!
Lei Guo

@LeiGuo 고쳤습니다.
yugr

26

os.chdir디렉토리를 변경하는 데 사용 합니다. glob.glob'.bak'로 끝나는 파일 이름 목록을 생성하는 데 사용하십시오 . 리스트의 요소는 단지 문자열입니다.

그런 다음 os.unlink파일을 제거하는 데 사용할 수 있습니다 . (PS. os.unlinkos.remove같은 기능의 동의어입니다.)

#!/usr/bin/env python
import glob
import os
directory='/path/to/dir'
os.chdir(directory)
files=glob.glob('*.bak')
for filename in files:
    os.unlink(filename)

18

Python 3.5에서는 os.scandir파일 속성이나 유형을 확인해야하는 경우에 더 좋습니다 os.DirEntry. 함수가 반환하는 객체의 속성을 참조하십시오 .

import os 

for file in os.scandir(path):
    if file.name.endswith(".bak"):
        os.unlink(file.path)

또한 디렉토리 DirEntry에 파일의 전체 경로가 이미 포함되어 있으므로 디렉토리를 변경할 필요가 없습니다 .


콜론이 빠졌습니다. for 루프 내부의 첫 번째 줄은if file.name.endswith(".bak"):
TSeymour

감사! 실제로 코드를 실행하지 않고 코드를 작성하도록 가르쳐 줄 것입니다.
Yi Jiang

8

함수를 만들 수 있습니다. 하위 디렉토리를 탐색 할 때 원하는대로 maxdepth를 추가하십시오.

def findNremove(path,pattern,maxdepth=1):
    cpath=path.count(os.sep)
    for r,d,f in os.walk(path):
        if r.count(os.sep) - cpath <maxdepth:
            for files in f:
                if files.endswith(pattern):
                    try:
                        print "Removing %s" % (os.path.join(r,files))
                        #os.remove(os.path.join(r,files))
                    except Exception,e:
                        print e
                    else:
                        print "%s removed" % (os.path.join(r,files))

path=os.path.join("/home","dir1","dir2")
findNremove(path,".bak")


1

Linux 및 macOS에서는 쉘에 대한 간단한 명령을 실행할 수 있습니다.

subprocess.run('rm /tmp/*.bak', shell=True)

3
내 의견으로는 좋은 선택이 아닙니다. 이식성이 없으며 추가 하위 프로세스로 인해 더 비쌉니다. Python API를 사용하는 것이 좋습니다.
Haakon

0

나는 이것이 오래되었다는 것을 알고있다. 그러나 여기에 os 모듈 만 사용하는 방법이 있습니다 ...

def purgedir(parent):
    for root, dirs, files in os.walk(parent):                                      
        for item in files:
            # Delete subordinate files                                                 
            filespec = os.path.join(root, item)
            if filespec.endswith('.bak'):
                os.unlink(filespec)
        for item in dirs:
            # Recursively perform this operation for subordinate directories   
            purgedir(os.path.join(root, item))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.