Наиболее питоновский способ удаления файла, который может не существовать
Я хочу удалить файл 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?
'pip' не распознан как командa внутреннего или внешнего формата
Почему statistics.mean() работает так медленно?
Преобразование строки даты JSON в datetime в Python
Есть ли разница между поднятием экземпляра класса Exception и самого класса Exception?