Tôi muốn xóa các tập tin filename
nếu nó tồn tại. Có đúng không?
if os.path.exists(filename):
os.remove(filename)
Có cách nào tốt hơn? Một cách một dòng?
unlink
và đặt nó trong không gian tên PHP.
Tôi muốn xóa các tập tin filename
nếu nó tồn tại. Có đúng không?
if os.path.exists(filename):
os.remove(filename)
Có cách nào tốt hơn? Một cách một dòng?
unlink
và đặt nó trong không gian tên PHP.
Câu trả lời:
Một cách pythonic hơn sẽ là:
try:
os.remove(filename)
except OSError:
pass
Mặc dù điều này thậm chí còn có nhiều dòng hơn và trông rất xấu xí, nhưng nó tránh được các cuộc gọi không cần thiết đến os.path.exists()
và tuân theo quy ước python về việc lạm dụng các ngoại lệ.
Có thể đáng để viết một hàm để làm điều này cho bạn:
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()
được thực thi không có nghĩa là nó tồn tại khi os.remove()
được thực thi.
Tôi thích loại bỏ một ngoại lệ hơn là kiểm tra sự tồn tại của tệp để tránh lỗi TOCTTOU . Câu trả lời của Matt là một ví dụ tốt về điều này, nhưng chúng ta có thể đơn giản hóa nó một chút trong Python 3, bằng cách sử dụng contextlib.suppress()
:
import contextlib
with contextlib.suppress(FileNotFoundError):
os.remove(filename)
Nếu filename
là một pathlib.Path
đối tượng thay vì một chuỗi, chúng ta có thể gọi .unlink()
phương thức của nó thay vì sử dụngos.remove()
. Theo kinh nghiệm của tôi, các đối tượng Path hữu ích hơn các chuỗi để thao tác hệ thống tập tin.
Vì mọi thứ trong câu trả lời này là độc quyền cho Python 3, nó cung cấp thêm một lý do để nâng cấp.
unlink(2)
, đó là giao diện lâu đời nhất ở đây.
except
mệnh đề, thì bạn nên sử dụng try
/ except
. Không thể rút ngắn một cách có ý nghĩa, bởi vì bạn phải có một dòng để giới thiệu khối đầu tiên, chính khối đó, một dòng để giới thiệu khối thứ hai, và sau đó là khối đó, vì vậy try
/ except
đã hết sức có thể.
os.path.exists
trả về True
cho các thư mục cũng như các tập tin. Xem xét sử dụng os.path.isfile
để kiểm tra xem các tập tin tồn tại thay thế.
Theo tinh thần câu trả lời của Andy Jones, làm thế nào về một hoạt động ternary đích thực:
os.remove(fn) if os.path.exists(fn) else None
Kể từ Python 3.8, hãy sử dụng missing_ok=True
và pathlib.Path.unlink
( tài liệu ở đây )
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()
Câu trả lời của Matt là câu trả lời đúng cho Pythons cũ và Kevin là câu trả lời đúng cho những người mới hơn.
Nếu bạn không muốn sao chép chức năng silentremove
này, chức năng này sẽ được hiển thị trong path.py dưới dạng remove_p :
from path import Path
Path(filename).remove_p()
if os.path.exists(filename): os.remove(filename)
là một lớp lót.
Nhiều người trong số các bạn có thể không đồng ý - có thể vì những lý do như xem xét đề xuất sử dụng chim nhạn "xấu xí" - nhưng điều này đặt ra câu hỏi liệu chúng ta có nên lắng nghe mọi người sử dụng các tiêu chuẩn xấu xí khi họ gọi một thứ không chuẩn là "xấu xí".
Trong Python 3.4 hoặc phiên bản mới hơn, cách pythonic sẽ là:
import os
from contextlib import suppress
with suppress(OSError):
os.remove(filename)
Một cái gì đó như thế này? Tận dụng lợi thế của đánh giá ngắn mạch. Nếu tệp không tồn tại, toàn bộ điều kiện không thể đúng, vì vậy python sẽ không bận tâm đến việc đánh giá phần thứ hai.
os.path.exists("gogogo.php") and os.remove("gogogo.php")
Một đề nghị KISS:
def remove_if_exists(filename):
if os.path.exists(filename):
os.remove(filename)
Và sau đó:
remove_if_exists("my.file")
Một giải pháp khác với thông điệp của riêng bạn trong ngoại lệ.
import os
try:
os.remove(filename)
except:
print("Not able to delete the file %s" % filename)
Tôi đã sử dụng rm
có thể buộc phải xóa các tệp không tồn tại với --preserve-root
tư cách là một tùy chọn rm
.
--preserve-root
do not remove `/' (default)
rm --help | grep "force"
-f, --force ignore nonexistent files and arguments, never prompt
Chúng ta cũng có thể sử dụng safe-rm ( sudo apt-get install safe-rm
)
Safe-rm là một công cụ an toàn nhằm ngăn chặn việc vô tình xóa các tệp quan trọng bằng cách thay thế / bin / rm bằng trình bao bọc, kiểm tra các đối số đã cho đối với danh sách đen các tệp và thư mục có thể định cấu hình không bao giờ bị xóa.
Đầu tiên tôi kiểm tra xem đường dẫn thư mục / tập tin có tồn tại hay không. Điều này sẽ ngăn cài đặt biến tệpToRemove /
thư mụcToRemove 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
một cách an toàn và ngăn chặn rm -r /
. @JonBrave
rm -f --preserve-root
không đủ tốt ( --preserve-root
dù sao cũng có thể là mặc định). Tôi đã đưa ra -r /
một ví dụ , nếu nó -r /home
hoặc bất cứ điều gì? Bạn có thể muốn rm -f -- $fileToRemove
, nhưng đó không phải là vấn đề.
os.system('rm ...')
là vô cùng nguy hiểm, xin lỗi.