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

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

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

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

Ответ 1

Более 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

Ответ 2

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

import contextlib

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

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

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

Ответ 3

os.path.exists возвращает True как для папок, так и для файлов. Рассмотрите возможность использования os.path.isfile, чтобы проверить, существует ли файл.

Ответ 4

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

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

Ответ 5

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

from glob import glob
import os

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

Glob находит все файлы, которые могли бы выбрать шаблон с подстановочным символом * nix и перебирает список.

Ответ 6

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

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

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

Ответ 7

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

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

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

Ответ 8

В версии Python 3.4 или более поздней версии, питонический путь:

import os
from contextlib import suppress

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

Ответ 9

Что-то вроде этого? Использует оценку короткого замыкания. Если файл не существует, все условие не может быть истинным, поэтому python не будет оценивать оценку второй части.

os.path.exists("gogogo.php") and os.remove("gogogo.php")

Ответ 10

Предложение KISS:

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

А потом:

remove_if_exists("my.file")

Ответ 11

Это еще одно решение:

if os.path.isfile(os.path.join(path, filename)):
    os.remove(os.path.join(path, filename))

Ответ 12

Другое решение с вашим собственным сообщением в исключении.

import os

try:
    os.remove(filename)
except:
    print("Not able to delete the file ", filename)

Ответ 13

Я использовал 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]

Ответ 14

Я бы просто использовал shutil

import shutil shutil.rmtree(filename, ignore_errors=True)

Ответ 15

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

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