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


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

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

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




Answers


Более питонический путь:

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



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

import contextlib

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

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

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




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




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

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



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

from glob import glob
import os

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

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




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

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

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




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

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



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

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

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



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

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




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

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