파일이 filename
있으면 삭제하고 싶습니다 . 말하는 것이 적절합니까?
if os.path.exists(filename):
os.remove(filename)
더 좋은 방법이 있습니까? 한 줄 방법?
unlink
하여 네임 스페이스 PHP에 넣습니다.
파일이 filename
있으면 삭제하고 싶습니다 . 말하는 것이 적절합니까?
if os.path.exists(filename):
os.remove(filename)
더 좋은 방법이 있습니까? 한 줄 방법?
unlink
하여 네임 스페이스 PHP에 넣습니다.
답변:
더 파이썬적인 방법은 다음과 같습니다.
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
os.path.exists()
실행될 때 존재한다는 것이 파일이 실행될 때 존재 한다는 것을 의미하지는 않습니다 os.remove()
.
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에만 적용되므로 업그레이드해야 할 또 다른 이유를 제공합니다.
unlink(2)
가장 오래된 관련 인터페이스 인과의 일관성을 원한다고 생각 합니다.
except
절이 필요하면 try
/ 를 사용해야합니다 except
. 첫 번째 블록을 소개하는 줄, 블록 자체, 두 번째 블록을 소개하는 줄, 그리고 그 블록이 있어야하기 때문에 try
/ except
는 이미 간결 하기 때문에 의미를 줄일 수 없습니다 .
os.path.exists
True
폴더와 파일을 반환 합니다. os.path.isfile
대신 파일이 존재하는지 확인 하는 데 사용 하십시오.
Andy Jones의 대답의 정신에서 진정한 삼항 연산은 어떻습니까?
os.remove(fn) if os.path.exists(fn) else None
if os.path.exists(filename): os.remove(filename)
하나의 라이너입니다.
많은 사람들이 동의하지 않을 수도 있습니다. 아마도 삼항 사용을 "추악한"사용을 고려하는 것과 같은 이유로 비표준적인 "못생긴"이라고 부르는 표준을 사용하는 사람들의 말에 귀를 기울여야하는지에 대한 의문이 생깁니다.
Python 3.4 이상 버전에서 파이썬 방식은 다음과 같습니다.
import os
from contextlib import suppress
with suppress(OSError):
os.remove(filename)
이 같은? 단락 평가를 활용합니다. 파일이 존재하지 않으면 전체 조건이 참이 될 수 없으므로 파이썬은 두 번째 부분을 평가하지 않습니다.
os.path.exists("gogogo.php") and os.remove("gogogo.php")
KISS 오퍼링 :
def remove_if_exists(filename):
if os.path.exists(filename):
os.remove(filename)
그리고:
remove_if_exists("my.file")
내가 사용한 rm
에 존재하지 않는 파일을 삭제하는 강제 할 수있는 --preserve-root
에 옵션으로 rm
.
--preserve-root
do not remove `/' (default)
rm --help | grep "force"
-f, --force ignore nonexistent files and arguments, never prompt
safe-rm ( sudo apt-get install safe-rm
)을 사용할 수도 있습니다
Safe-rm은 / bin / rm을 래퍼로 바꾸어 실수로 중요한 파일이 삭제되는 것을 방지하기위한 안전 도구로, 제거 할 수없는 파일 및 디렉토리의 구성 가능한 블랙리스트에 대해 지정된 인수를 검사합니다.
먼저 폴더 / 파일 경로가 있는지 확인합니다. 변수 fileToRemove /
folderToRemove to the string
-r /`를 설정하지 못하게합니다 .
import os, subprocess
fileToRemove = '/home/user/fileName';
if os.path.isfile(fileToRemove):
subprocess.run(['rm', '-f', '--preserve-root', fileToRemove]
subprocess.run(['safe-rm', '-f', fileToRemove]
rm
안전하게 사용 하고 예방하기 위해 답변을 추가했습니다 rm -r /
. @JonBrave
rm -f --preserve-root
충분하지 않습니다 ( --preserve-root
어쨌든 기본값 일 것입니다). 나는 -r /
예를 들어 , 그것이 -r /home
무엇이든 아니면 무엇입니까? 아마도 원 rm -f -- $fileToRemove
하지만 그게 요점이 아닙니다.
os.system('rm ...')
것은 매우 위험합니다. 죄송합니다.