[python] 존재하지 않을 수있는 파일을 삭제하는 가장 pythonic 방법

파일이 filename있으면 삭제하고 싶습니다 . 말하는 것이 적절합니까?

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

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



답변

더 파이썬적인 방법은 다음과 같습니다.

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

이것은 더 많은 행을 취하고 매우 추악하게 보이지만 os.path.exists()예외를 과도하게 사용하는 파이썬 규칙을 불필요하게 호출하고 피합니다 .

이를 위해 함수를 작성하는 것이 좋습니다.

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의 대답은 이에 대한 좋은 예이지만 다음을 사용하여 Python 3에서 약간 단순화 할 수 있습니다 contextlib.suppress().

import contextlib

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

경우 filenameA는 pathlib.Path문자열이 아닌 객체가, 우리는 호출 할 수 있습니다 .unlink()사용하는 대신 방법을 os.remove(). 필자의 경험에 따르면 Path 객체는 파일 시스템 조작에 문자열보다 유용합니다.

이 답변의 모든 내용은 Python 3에만 적용되므로 업그레이드해야 할 또 다른 이유를 제공합니다.


답변

os.path.existsTrue폴더와 파일을 반환 합니다. 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 와일드 카드로 패턴을 선택할 수있는 모든 파일을 찾고 목록을 반복합니다.


답변

Python 3.8부터 missing_ok=Trueand pathlib.Path.unlink( docs here )를 사용 하십시오.

from pathlib import Path

my_file = Path("./dir1/dir2/file.txt")

# Python 3.8+
my_file.unlink(missing_ok=True)

# Python 3.7 and earlier
if my_file.exists():
    my_file.unlink()


답변

Matt의 답변 은 오래된 Python에 적합하고 Kevin 은 새로운 Python에 적합합니다.

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

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