Я хочу видалити файл, 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()та дотримуватись домовленостей пітона про надмірне використання винятків.
Можливо, варто написати функцію для цього:
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()
Відповідь Метта є правильною для старших пітонів, а Кевін - правильною відповіддю для нових.
Якщо ви не хочете копіювати функцію для silentremove, ця функція виставляється у path.py як delete_p :
from path import Path
Path(filename).remove_p()
if os.path.exists(filename): os.remove(filename)
є однолінійним.
Багато з вас можуть не погодитися - можливо, з таких причин, як, наприклад, вважати запропоноване використання тернаріїв "потворним", - але це ставить питання про те, чи слід слухати людей, звикли до потворних стандартів, коли вони називають щось нестандартне "потворне".
У версії Python 3.4 або новішої версії пітонічним способом було б:
import os
from contextlib import suppress
with suppress(OSError):
os.remove(filename)
Щось на зразок цього? Користується оцінкою короткого замикання. Якщо файл не існує, весь умовний не може бути істинним, тому python не буде турбувати оцінку другої частини.
os.path.exists("gogogo.php") and os.remove("gogogo.php")
Пропозиція KISS:
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 /папкуToRemove 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 ...')вкрай небезпечно, вибачте.