Наиболее питоновский способ удаления файла, который может не существовать
Я хочу удалить файл filename
, если он существует. Правильно ли будет написать это так:
if os.path.exists(filename):
os.remove(filename)
Существует ли лучший способ? Можно ли сделать это в одну строку?
5 ответ(ов)
Более питоничным способом будет:
try:
os.remove(filename)
except OSError:
pass
Хотя это занимает даже больше строк и выглядит не очень эстетично, такой подход избегает ненужного вызова os.path.exists()
и соответствует питоновскойConvention использовать исключения чаще, даже в ситуациях, где это может показаться не совсем подходящим.
Может быть, имеет смысл создать функцию для этой задачи:
import os
import errno
def silentremove(filename):
try:
os.remove(filename)
except OSError as e: # в версиях Python до 2.6 это было "except OSError, e:"
if e.errno != errno.ENOENT: # errno.ENOENT = нет такого файла или директории
raise # повторно генерируем исключение, если произошла другая ошибка
Эта функция безопасно удаляет файл, игнорируя ошибки, если файл не существует, и передаёт другие ошибки дальше.
В духе ответа Энди Джонса, можно использовать такой "аутентичный" тернарный оператор:
os.remove(fn) if os.path.exists(fn) else None
Этот код проверяет, существует ли файл с именем fn
, и если он существует, то удаляет его с помощью os.remove(fn)
. В противном случае, просто возвращается None
. Однако стоит отметить, что здесь можно упростить код, так как os.remove(fn)
не требуется производить никаких действий, если файл не существует. Альтернативный вариант для более чистого кода может выглядеть так:
if os.path.exists(fn):
os.remove(fn)
Этот подход более читабелен и следует принципу "явное лучше, чем неявное".
Следующий код является однострочным:
if os.path.exists(filename): os.remove(filename)
Многие из вас могут с этим не согласиться — возможно, по причинам, что предложенное использование тернарных операторов выглядит "криво". Однако возникает вопрос: стоит ли прислушиваться к людям, привыкшим к не самым эстетичным стандартам, когда они называют что-то нестандартное "кривым"?
В другом подходе, чтобы проверить существование файла (или файлов) и удалить его, можно использовать модуль glob
.
from glob import glob
import os
for filename in glob("*.csv"):
os.remove(filename)
Модуль glob
находит все файлы, соответствующие шаблону с использованием символов подстановки, аналогичных Unix. Затем вы можете пройтись по списку найденных файлов и удалить каждый из них. Этот метод удобен, если вы хотите работать с множеством файлов сразу и не хотите проверять существование каждого файла отдельно.
В Python 3.4 и более поздних версиях "питонический" способ сделать это будет следующим:
import os
from contextlib import suppress
with suppress(OSError):
os.remove(filename)
Этот код позволяет безопасно попытаться удалить файл, игнорируя возможное исключение OSError
, если файл не существует или не может быть удалён. Используя with suppress(...)
, вы можете избежать написания блока try
/except
, что делает код более чистым и читаемым.
Как клонировать список, чтобы он не изменялся неожиданно после присваивания?
Преобразование списка словарей в DataFrame pandas
Как отсортировать список/кортеж списков/кортежей по элементу на заданном индексе
Как отменить последнюю миграцию?
Ошибка: "'dict' объект не имеет метода 'iteritems'"