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


Answers

Я предпочитаю подавлять исключение, а не проверять наличие файла, чтобы избежать ошибки TOCTTOU . Ответ Мэтта - хороший пример этого, но мы можем немного упростить его под Python 3, используя contextlib.suppress() :

import contextlib

with contextlib.suppress(FileNotFoundError):
    os.remove(filename)

Если filename является объектом pathlib.Path вместо строки, мы можем вызвать его .unlink() вместо использования os.remove() . По моему опыту, объекты Path более полезны, чем строки для манипулирования файловой системой.

Поскольку все в этом ответе исключительно для Python 3, оно предоставляет еще одну причину для обновления.

Question

Я хочу удалить filename если он существует. Правильно ли говорить

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

Есть ли способ лучше? Однострочный путь?




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

является однострочным.

Многие из вас могут не согласиться - возможно, по таким причинам, как рассмотрение предполагаемого использования троянов «уродливое», но это ставит вопрос о том, следует ли нам слушать людей, привыкших к уродливым стандартам, когда они называют что-то нестандартное «уродливое».




Мне нравится использовать rm который может принудительно удалить несуществующие файлы.

rm --help | grep "force"
  -f, --force           ignore nonexistent files and arguments, never prompt
import os

os.environ['filename'] = filename;
os.system('rm -f $filename')



Ответ Мэтта является правильным для старших Питонов, а Кевин - правильным ответом для более новых.

Если вы не хотите копировать функцию для silentremove , эта функция path.py в path.py как remove_p :

from path import Path
Path(filename).remove_p()



os.remove должен работать нормально:

import os
Input = input('File:')
File = Input.get()
try:
  os.remove(File)
except:
  none




В духе ответа Энди Джонса, как насчет подлинной троичной операции:

os.remove(fn) if os.path.exists(fn) else None