Я хочу удалить файл, filename
если он существует. Правильно ли говорить
if os.path.exists(filename):
os.remove(filename)
Есть ли способ лучше? Однострочным способом?
unlink
и поместите ее в пространство имен PHP.
Я хочу удалить файл, filename
если он существует. Правильно ли говорить
if os.path.exists(filename):
os.remove(filename)
Есть ли способ лучше? Однострочным способом?
unlink
и поместите ее в пространство имен PHP.
Ответы:
Более питонический путь был бы:
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
os.path.exists()
выполняется, не означает, что он существует, когда os.remove()
выполняется.
Я предпочитаю подавлять исключение, а не проверять наличие файла, чтобы избежать ошибки TOCTTOU . Ответ Мэтта является хорошим примером этого, но мы можем немного упростить его в Python 3, используя contextlib.suppress()
:
import contextlib
with contextlib.suppress(FileNotFoundError):
os.remove(filename)
Если filename
это pathlib.Path
объект, а не строка, мы можем вызвать его .unlink()
метод вместо использования os.remove()
. По моему опыту, объекты Path более полезны, чем строки для манипулирования файловой системой.
Поскольку все в этом ответе является эксклюзивным для Python 3, это дает еще одну причину для обновления.
unlink(2)
, которое является безусловно самым старым соответствующим интерфейсом здесь.
except
пункт, то вы должны использовать try
/ except
. Его нельзя существенно сократить, потому что у вас должна быть строка для ввода первого блока, сам блок, строка для ввода второго блока, а затем этот блок, поэтому try
/ except
уже настолько кратко, насколько это возможно.
os.path.exists
возвращает True
для папок, а также файлов. Попробуйте использовать, os.path.isfile
чтобы проверить, существует ли файл вместо этого.
В духе ответа Энди Джонса, как насчет подлинной троичной операции:
os.remove(fn) if os.path.exists(fn) else None
Начиная с Python 3.8, используйте missing_ok=True
и pathlib.Path.unlink
( документы здесь )
from pathlib import Path
my_file = Path("./dir1/dir2/file.txt")
# Python 3.8+
my_file.unlink(missing_ok=True)
# Python 3.7 and earlier
if my_file.exists():
my_file.unlink()
Другой способ узнать, существует ли файл (или файлы), и удалить его, используя глобус модуля.
from glob import glob
import os
for filename in glob("*.csv"):
os.remove(filename)
Glob находит все файлы, которые могут выбрать шаблон с подстановочным знаком * nix, и зацикливает список.
Ответ Мэтта правильный для старших Питонов, а Кевин правильный для новых.
Если вы не хотите копировать функцию silentremove
, эта функциональность отображается в path.py как remove_p :
from path import Path
Path(filename).remove_p()
if os.path.exists(filename): os.remove(filename)
это однострочник
Многие из вас могут не согласиться - возможно, по таким причинам, как, например, предполагаемое использование троичных растений «некрасиво», но возникает вопрос о том, следует ли нам слушать людей, привыкших к уродливым стандартам, когда они называют что-то нестандартное «некрасивым».
В Python 3.4 или более поздней версии pythonic путь будет:
import os
from contextlib import suppress
with suppress(OSError):
os.remove(filename)
Что-то вроде этого? Использует преимущества оценки короткого замыкания. Если файл не существует, все условие не может быть истинным, поэтому python не будет беспокоить оценку второй части.
os.path.exists("gogogo.php") and os.remove("gogogo.php")
Поцелуй предложение:
def remove_if_exists(filename):
if os.path.exists(filename):
os.remove(filename)
А потом:
remove_if_exists("my.file")
Другое решение с вашим собственным сообщением в исключении.
import os
try:
os.remove(filename)
except:
print("Not able to delete the file %s" % filename)
Я использовал, rm
который может заставить удалить несуществующие файлы --preserve-root
в качестве опции rm
.
--preserve-root
do not remove `/' (default)
rm --help | grep "force"
-f, --force ignore nonexistent files and arguments, never prompt
Мы также можем использовать safe-rm ( sudo apt-get install safe-rm
)
Safe-rm - это инструмент безопасности, предназначенный для предотвращения случайного удаления важных файлов путем замены / 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]
rm
безопасно и предотвратить rm -r /
. @JonBrave
rm -f --preserve-root
не достаточно хорош ( --preserve-root
вероятно, по умолчанию в любом случае). Я привел -r /
в качестве примера , что если это -r /home
или что-то еще? Вы, вероятно, хотите rm -f -- $fileToRemove
, но это не главное.
os.system('rm ...')
подвергание крайне опасно, извините.