파일이 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)
경우 filename
A는 pathlib.Path
문자열이 아닌 객체가, 우리는 호출 할 수 있습니다 .unlink()
사용하는 대신 방법을 os.remove()
. 필자의 경험에 따르면 Path 객체는 파일 시스템 조작에 문자열보다 유용합니다.
이 답변의 모든 내용은 Python 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 와일드 카드로 패턴을 선택할 수있는 모든 파일을 찾고 목록을 반복합니다.
답변
Python 3.8부터 missing_ok=True
and 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.py 에 remove_p로 표시됩니다 .
from path import Path
Path(filename).remove_p()