6

Наиболее питоновский способ удаления файла, который может не существовать

1

Я хочу удалить файл filename, если он существует. Правильно ли будет написать это так:

if os.path.exists(filename):
    os.remove(filename)

Существует ли лучший способ? Можно ли сделать это в одну строку?

5 ответ(ов)

8

Более питоничным способом будет:

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  # повторно генерируем исключение, если произошла другая ошибка

Эта функция безопасно удаляет файл, игнорируя ошибки, если файл не существует, и передаёт другие ошибки дальше.

0

В духе ответа Энди Джонса, можно использовать такой "аутентичный" тернарный оператор:

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)

Этот подход более читабелен и следует принципу "явное лучше, чем неявное".

0

Следующий код является однострочным:

if os.path.exists(filename): os.remove(filename)

Многие из вас могут с этим не согласиться — возможно, по причинам, что предложенное использование тернарных операторов выглядит "криво". Однако возникает вопрос: стоит ли прислушиваться к людям, привыкшим к не самым эстетичным стандартам, когда они называют что-то нестандартное "кривым"?

0

В другом подходе, чтобы проверить существование файла (или файлов) и удалить его, можно использовать модуль glob.

from glob import glob
import os

for filename in glob("*.csv"):
    os.remove(filename)

Модуль glob находит все файлы, соответствующие шаблону с использованием символов подстановки, аналогичных Unix. Затем вы можете пройтись по списку найденных файлов и удалить каждый из них. Этот метод удобен, если вы хотите работать с множеством файлов сразу и не хотите проверять существование каждого файла отдельно.

0

В Python 3.4 и более поздних версиях "питонический" способ сделать это будет следующим:

import os
from contextlib import suppress

with suppress(OSError):
    os.remove(filename)

Этот код позволяет безопасно попытаться удалить файл, игнорируя возможное исключение OSError, если файл не существует или не может быть удалён. Используя with suppress(...), вы можете избежать написания блока try/except, что делает код более чистым и читаемым.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь