วิธีเปิด / ปิดไฟล์ใน python 2.4 อย่างปลอดภัย


87

ฉันกำลังเขียนสคริปต์ขนาดเล็กสำหรับใช้บนเซิร์ฟเวอร์ของเราโดยใช้ Python เซิร์ฟเวอร์ติดตั้ง Python 2.4.4 เท่านั้น

ฉันไม่ได้เริ่มใช้ Python จนกระทั่ง 2.5 หมดดังนั้นฉันจึงคุ้นเคยกับแบบฟอร์ม:

with open('file.txt', 'r') as f:
    # do stuff with f

อย่างไรก็ตามไม่มีwithคำสั่งใด ๆก่อน 2.5 และฉันมีปัญหาในการค้นหาตัวอย่างเกี่ยวกับวิธีที่เหมาะสมในการล้างไฟล์ด้วยตนเอง

แนวทางปฏิบัติที่ดีที่สุดในการกำจัดออบเจ็กต์ไฟล์อย่างปลอดภัยเมื่อใช้ python เวอร์ชันเก่าคืออะไร

คำตอบ:


140

ดูdocs.python.org :

เมื่อคุณทำไฟล์เสร็จแล้วให้เรียกใช้ f.close () เพื่อปิดและเพิ่มทรัพยากรระบบใด ๆ ที่ไฟล์เปิดขึ้นมา หลังจากเรียกใช้ f.close () การพยายามใช้ไฟล์อ็อบเจ็กต์จะล้มเหลวโดยอัตโนมัติ

ดังนั้นใช้close()อย่างหรูหราด้วยtry/finally:

f = open('file.txt', 'r')

try:
    # do stuff with f
finally:
    f.close()

สิ่งนี้ช่วยให้มั่นใจได้ว่าแม้ว่า# do stuff with fจะมีข้อยกเว้นfก็จะยังคงปิดอย่างเหมาะสม

โปรดทราบว่าopenควรปรากฏภายนอกไฟล์try. หากopenเกิดข้อยกเว้นขึ้นแสดงว่าไฟล์นั้นไม่ได้เปิดและไม่จำเป็นต้องปิด นอกจากนี้ถ้าopenยกข้อยกเว้นผลของมันจะไม่ได้รับมอบหมายให้และมันก็เป็นข้อผิดพลาดในการเรียกร้องff.close()


ง่ายมากขอบคุณ ด้วยเหตุผลบางอย่างฉันคาดหวังว่าฉันต้องการอะไรที่เกี่ยวข้องมากกว่านี้
TM.

16
หากopenล้มเหลวข้อยกเว้นจะเกิดขึ้นก่อนที่try/finallyจะป้อนบล็อกด้วยซ้ำ ดังนั้นcloseจะไม่ถูกเรียก (นั่นเป็นเหตุผลที่คุณควรโทรหาopenก่อนtry)
FogleBird

1
@TM ฉันเพิ่มหมายเหตุเกี่ยวกับการopenเพิ่มข้อยกเว้น
Jon-Eric

4
นี่คือสิ่งที่คำสั่ง with แปลว่าเบื้องหลัง
Arlaharen

1
การเปิดไฟล์ควรเกิดขึ้นภายในการลอง
Anthony Rutledge

32

ในวิธีแก้ปัญหาข้างต้นทำซ้ำที่นี่:

f = open('file.txt', 'r')

try:
    # do stuff with f
finally:
   f.close()

หากมีสิ่งเลวร้ายเกิดขึ้น (คุณไม่เคยรู้ ... ) หลังจากเปิดไฟล์สำเร็จและก่อนการลองไฟล์จะไม่ถูกปิดดังนั้นทางออกที่ปลอดภัยกว่าคือ:

f = None
try:
    f = open('file.txt', 'r')

    # do stuff with f

finally:
    if f is not None:
       f.close()

การใช้คำสั่ง with open (... ) ไม่ว่าไฟล์ with block จะเสร็จสิ้น (แม้จะมีข้อยกเว้น) ก็ตาม
darkgaze

@darkgaze with open(...)เป็นตัวเลือกที่ดีที่สุดใน Python สมัยใหม่
mljrg

12

ไม่จำเป็นต้องปิดไฟล์ตามเอกสารหากคุณใช้กับ:

เป็นแนวทางปฏิบัติที่ดีในการใช้คีย์เวิร์ดร่วมกับอ็อบเจ็กต์ไฟล์ สิ่งนี้มีข้อดีคือปิดไฟล์ได้อย่างถูกต้องหลังจากที่ชุดโปรแกรมเสร็จสิ้นแม้ว่าจะมีข้อยกเว้นเกิดขึ้นระหว่างทางก็ตาม นอกจากนี้ยังสั้นกว่าการเขียนบล็อกลองสุดท้ายที่เทียบเท่ากันมาก:

>>> with open('workfile', 'r') as f:
...     read_data = f.read()
>>> f.closed
True

เพิ่มเติมที่นี่: https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects


นี่เป็นทั้งที่ถูกต้องและไม่เข้าใจคำถาม
Jon-Eric

-4

นี่คือตัวอย่างที่กำหนดวิธีการใช้งานopenและ "pythonclose

from sys import argv
script,filename=argv
txt=open(filename)
print "filename %r" %(filename)
print txt.read()
txt.close()
print "Change the file name"
file_again=raw_input('>')
print "New file name %r" %(file_again)
txt_again=open(file_again)
print txt_again.read()
txt_again.close()

จำเป็นที่คุณจะต้องปิดไฟล์กี่ครั้งในครั้งนั้น


1
หากมีข้อยกเว้นเกิดขึ้นหลังจากopenก่อนหน้าcloseนี้ไฟล์จะไม่ถูกปิดอย่างถูกต้องโดยใช้วิธีนี้ การใช้withหรือtry/ finallyปิดไฟล์อย่างถูกต้องแม้ว่าจะมีข้อยกเว้นก็ตาม
Jon-Eric
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.