ฉันต้องการลบไฟล์filename
หากมีอยู่ มันเหมาะสมที่จะพูด
if os.path.exists(filename):
os.remove(filename)
มีวิธีที่ดีกว่า? ทางเดียวหรือไม่
unlink
และวางไว้ใน namespace PHP
ฉันต้องการลบไฟล์filename
หากมีอยู่ มันเหมาะสมที่จะพูด
if os.path.exists(filename):
os.remove(filename)
มีวิธีที่ดีกว่า? ทางเดียวหรือไม่
unlink
และวางไว้ใน namespace PHP
คำตอบ:
วิธี pythonic เพิ่มเติมจะเป็น:
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 คำตอบของ Matt เป็นตัวอย่างที่ดีของเรื่องนี้ แต่เราสามารถทำให้มันง่ายขึ้นเล็กน้อยภายใต้ Python 3 โดยใช้contextlib.suppress()
:
import contextlib
with contextlib.suppress(FileNotFoundError):
os.remove(filename)
หากfilename
เป็นpathlib.Path
วัตถุแทนสตริงเราสามารถเรียกมันวิธีการแทนการใช้.unlink()
os.remove()
ในประสบการณ์ของฉันวัตถุเส้นทางมีประโยชน์มากกว่าสตริงสำหรับการจัดการระบบไฟล์
เนื่องจากทุกอย่างในคำตอบนี้เป็นเอกสิทธิ์ของ Python 3 จึงเป็นอีกเหตุผลหนึ่งที่ทำให้อัปเกรด
unlink(2)
ซึ่งเป็นอินเทอร์เฟซที่เกี่ยวข้องที่เก่าแก่ที่สุดที่นี่
except
ข้อแล้วคุณควรใช้/try
except
ไม่สามารถย่อให้สั้นลงอย่างมีความหมายได้เนื่องจากคุณจะต้องมีบรรทัดเพื่อแนะนำบล็อกแรกบล็อกนั้นเองบรรทัดเพื่อแนะนำบล็อกที่สองจากนั้นบล็อกนั้นดังนั้นtry
/ except
จึงสั้นที่สุด
os.path.exists
ส่งคืนTrue
สำหรับโฟลเดอร์รวมถึงไฟล์ ลองใช้os.path.isfile
เพื่อตรวจสอบว่ามีไฟล์อยู่หรือไม่
ด้วยจิตวิญญาณของคำตอบของ Andy Jones วิธีการดำเนินงานที่ประกอบไปด้วยของจริง:
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()
อีกวิธีหนึ่งในการทราบว่ามีไฟล์ (หรือไฟล์) อยู่หรือไม่และจะลบออกหรือไม่โดยใช้โมดูล glob
from glob import glob
import os
for filename in glob("*.csv"):
os.remove(filename)
Glob ค้นหาไฟล์ทั้งหมดที่สามารถเลือกรูปแบบด้วย wildcard * nix และวนซ้ำรายการ
คำตอบของ Matt เป็นคำตอบที่ดีสำหรับ Pythons ที่มีอายุมากกว่าและคำตอบที่ถูกของ Kevinสำหรับคำตอบใหม่
หากคุณไม่ต้องการคัดลอกฟังก์ชั่นสำหรับsilentremove
ฟังก์ชั่นนี้จะปรากฏในpath.pyเป็นremove_p :
from path import Path
Path(filename).remove_p()
if os.path.exists(filename): os.remove(filename)
เป็นหนึ่งซับ
พวกคุณหลายคนอาจไม่เห็นด้วย - อาจเป็นเพราะเหตุผลเช่นการพิจารณาการใช้ ternaries "น่าเกลียด" - แต่สิ่งนี้ทำให้เกิดคำถามว่าเราควรฟังคนที่เคยใช้มาตรฐานที่น่าเกลียดเมื่อพวกเขาเรียกสิ่งที่ไม่ได้มาตรฐานหรือไม่
ใน 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")
นี่เป็นวิธีแก้ปัญหาอื่น:
if os.path.isfile(os.path.join(path, filename)):
os.remove(os.path.join(path, filename))
โซลูชันอื่นที่มีข้อความของคุณเองยกเว้น
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 ด้วย wrapper ซึ่งตรวจสอบข้อโต้แย้งที่กำหนดกับบัญชีดำของไฟล์และไดเรกทอรีที่กำหนดค่าได้ซึ่งไม่ควรลบออก
ก่อนอื่นฉันจะตรวจสอบว่ามีเส้นทางโฟลเดอร์ / ไฟล์อยู่หรือไม่ สิ่งนี้จะป้องกันการตั้งค่าตัวแปร 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 ...')
เป็นอันตรายอย่างยิ่งขอโทษ