Я хочу удалить файл filename
, если он существует. Правильно ли говорить
if os.path.exists(filename):
os.remove(filename)
Есть ли лучший способ? Однострочный путь?
Я хочу удалить файл filename
, если он существует. Правильно ли говорить
if os.path.exists(filename):
os.remove(filename)
Есть ли лучший способ? Однострочный путь?
Более 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 - хороший пример этого, но мы можем немного упростить его под Python 3, используя contextlib.suppress()
:
import contextlib
with contextlib.suppress(FileNotFoundError):
os.remove(filename)
Если filename
является объектом pathlib.Path
вместо строки, мы можем вызвать его .unlink()
вместо использования os.remove()
. По моему опыту, объекты Path более полезны, чем строки для манипулирования файловой системой.
Так как все в этом ответе исключительно для Python 3, оно предоставляет еще одну причину для обновления.
os.path.exists
возвращает True
как для папок, так и для файлов. Рассмотрите возможность использования os.path.isfile
, чтобы проверить, существует ли файл.
В духе ответа Энди Джонса, как насчет аутентичной троичной операции:
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)
является однострочным.
Многие из вас могут не согласиться - возможно, по таким причинам, как рассмотрение предлагаемого использования тройников "уродливое", но это ставит вопрос о том, следует ли нам слушать людей, привыкших к уродливым стандартам, когда они называют что-то нестандартное "уродливое".
Мэтт ответ правильный для старших Питонов, а Кевин - правильный ответ для более новых.
Если вы не хотите копировать функцию для silentremove
, эта функция отображается в path.py как remove_p:
from path import Path
Path(filename).remove_p()
В версии Python 3.4 или более поздней версии, питонический путь:
import os
from contextlib import suppress
with suppress(OSError):
os.remove(filename)
Что-то вроде этого? Использует оценку короткого замыкания. Если файл не существует, все условие не может быть истинным, поэтому python не будет оценивать оценку второй части.
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")
Это еще одно решение:
if os.path.isfile(os.path.join(path, filename)):
os.remove(os.path.join(path, filename))
Другое решение с вашим собственным сообщением в исключении.
import os
try:
os.remove(filename)
except:
print("Not able to delete the file ", filename)
Я использовал rm
который может принудительно удалить несуществующие файлы с параметром --preserve-root
в качестве опции для rm
.
--preserve-root
do not remove '/' (default)
rm --help | grep "force"
-f, --force ignore nonexistent files and arguments, never prompt
Мы также можем использовать safe -r m (sudo apt-get install safe-rm
)
Safe -r m - это инструмент безопасности, предназначенный для предотвращения случайного удаления важных файлов путем замены /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]
Я бы просто использовал 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