python - 존재하지 않을 수있는 파일을 삭제하는 가장 파이썬적인 방법


파일 filename 있으면 삭제하고 싶습니다. 말하기에 합당한가?

if os.path.exists(filename):
    os.remove(filename)

더 좋은 방법이 있습니까? 한 줄로?


Answers



더 pythonic 방법은 다음과 같습니다 :

try:
    os.remove(filename)
except OSError:
    pass

이것은 더 많은 라인을 필요로하고 매우보기 싫어 보이지만, os.path.exists() 대한 불필요한 호출을 피하고 예외를 과도하게 사용하는 python 규칙을 따릅니다.

이 작업을 수행하는 함수를 작성하는 것이 좋습니다.

import os, errno

def silentremove(filename):
    try:
        os.remove(filename)
    except OSError as e: # this would be "except OSError, e:" before Python 2.6
        if e.errno != errno.ENOENT: # errno.ENOENT = no such file or directory
            raise # re-raise exception if a different error occurred



필자는 TOCTTOU 버그를 피하기 위해 파일의 존재 여부를 확인하기보다는 예외를 억제하는 것을 선호합니다. Matt의 대답은 이것의 좋은 예이지만 contextlib.suppress() 사용하여 Python 3에서 약간 단순화 할 수 있습니다.

import contextlib

with contextlib.suppress(FileNotFoundError):
    os.remove(filename)

filename 이 문자열 대신 pathlib.Path 객체 인 경우 .unlink() 를 사용하는 대신 .unlink() 메서드를 호출 할 수 있습니다. 필자의 경험에 따르면 Path 객체는 파일 시스템 조작을 위해 문자열보다 유용합니다.

이 답변의 모든 내용이 파이썬 3 전용이기 때문에 업그레이드해야 할 또 다른 이유가 있습니다.




os.path.exists 는 폴더와 파일에 대해 True 를 반환합니다. os.path.isfile 을 사용하여 파일이 존재하는지 여부를 확인하십시오.




앤디 존스 (Andy Jones)의 대답의 정신에서 진정한 삼중 항법은 어떨까요?

os.remove(fn) if os.path.exists(fn) else None



파일 (들)이 존재 하는지를 확인하고 그것을 제거하는 다른 방법은 모듈 glob을 사용하는 것입니다.

from glob import glob
import os

for filename in glob("*.csv"):
    os.remove(filename)

Glob은 * nix 와일드 카드로 패턴을 선택할 수있는 모든 파일을 찾고 목록을 반복합니다.




if os.path.exists(filename): os.remove(filename)

하나의 라이너입니다.

많은 사람들이 동의하지 않을 수 있습니다 - 아마도 삼중의 사용을 "추악한"것으로 생각하는 것과 같은 이유에서 - 그러나 이것은 표준이 아닌 "추악한"것을 부를 때 추악한 표준에 익숙한 사람들의 말을 들어야하는지에 대한 질문을 야기합니다.




이 같은? 단락 회로 평가를 활용합니다. 파일이 존재하지 않으면 전체 조건부가 참일 수 없으므로 파이썬은 두 번째 부분을 평가하지 않습니다.

os.path.exists("gogogo.php") and os.remove("gogogo.php")



Matt의 답변은 구형 파이톤 스에 적합한 답변이고, 케빈은 최신 답변입니다.

silentremove 함수를 복사하지 않으려면이 기능이 path.pyremove_p :로 표시됩니다.

from path import Path
Path(filename).remove_p()



나는 단지 shutil을 사용할 것이다.

import shutil shutil.rmtree(filename, ignore_errors=True)




os.remove는 잘 작동해야합니다.

import os
Input = input('File:')
File = Input.get()
try:
  os.remove(File)
except:
  none