การปิดไฟล์หลังจากเปิดโดยใช้ `open ()` จำเป็นใน Python หรือไม่ [ปิด]


9

เกี่ยวกับคำถามก่อนหน้านี้ฉันสังเกตว่าทั้งคำตอบที่ใช้open()ฟังก์ชั่นนั้นไม่มีการกล่าวถึงการปิดไฟล์

ฉันได้อ่านว่ามันเป็นการปฏิบัติที่ดีที่จะทำเช่นนั้น แต่จริง ๆ แล้วมันจำเป็นต้องมีหรือไม่? มันเป็นเพียงรหัสที่ไม่จำเป็น?

ไฟล์ถูกปิดโดยอัตโนมัติหรือไม่?


1
with open (file_name, ...) as variable:เรียกใช้close()เมธอดโดยอัตโนมัติทันทีที่คุณออกจากบล็อกรหัสนี้
ผู้บัญชาการไบต์

1
สำเนาข้ามไซต์ของstackoverflow.com/q/7395542/4464570
ผู้บัญชาการ Byte

@ByteCommander คุณต้องการที่จะแสดงความคิดเห็นของคุณเป็นคำตอบที่จะทำให้คำถามนี้ 'แก้ไข'?
TellMe ทำไม

1
ในpython3ไฟล์จะถูกอ่านโดยอัตโนมัติเมื่อไม่มีการอ้างอิงอีก
Jacob Vlijm

4
ฉันลงคะแนนให้ปิดคำถามนี้เป็นนอกหัวข้อเนื่องจากเป็นคำถามทั่วไปเกี่ยวกับ Python ที่ไม่มีการเชื่อมต่อกับสคริปต์ใน Ubuntu มันถามเกี่ยวกับแนวทางปฏิบัติที่ดีที่สุดในภาษาการเขียนโปรแกรม
terdon

คำตอบ:


9

ไฟล์ปิดเมื่อใด

ในขณะที่เราสามารถเรียนรู้จากการปิดไฟล์สำคัญหรือไม่ (StackOverflow) Python interpreter ปิดไฟล์ในกรณีต่อไปนี้:

  • คุณเรียกใช้close()วิธีการของfileวัตถุด้วยตนเองอย่างชัดเจนหรือโดยปริยายโดยออกจากwith open(...):บล็อก แน่นอนว่าใช้ได้ผลเสมอและในทุกการใช้งานของ Python
  • การfileอ้างอิงครั้งสุดท้ายของวัตถุถูกลบและดังนั้นวัตถุจะได้รับการประมวลผลโดย Garbage Collector นี่ไม่ใช่คุณสมบัติภาษา แต่เป็นคุณสมบัติพิเศษของการติดตั้ง CPython เท่านั้นดังนั้นเพื่อความสะดวกในการพกพาอย่าพึ่งพาสิ่งนี้!
  • ล่าม Python สิ้นสุดลง ในกรณีนี้ควรปิดตัวจัดการไฟล์ทั้งหมดที่เปิดขึ้นมา Python3 เวอร์ชั่นเก่าบางรุ่นจะพิมพ์คำเตือนด้วยว่าคุณควรปิดมันด้วยตนเอง อย่างไรก็ตามลองจินตนาการว่าเกิดความผิดพลาดหรือคุณบังคับให้ล่าม Python และคุณจะเห็นว่าสิ่งนี้ไม่น่าเชื่อถือ

ดังนั้นวิธีแรกเท่านั้น (ด้วยตนเอง) จึงเชื่อถือได้!

จะเกิดอะไรขึ้นหากไฟล์เปิดอยู่

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

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

ประการที่สามไฟล์ที่เปิดอยู่บนอุปกรณ์พกพาจะป้องกันไม่ให้ถอดออกหรือถอดออก คุณยังคงสามารถลบไฟล์ในระบบไฟล์บางระบบเช่นext4ที่ไฟล์ descriptor / ฮาร์ดลิงก์ไปยัง inode ของไฟล์ถูกลบ / ยกเลิกการเชื่อมโยง แต่โปรแกรมที่เปิดไฟล์อาจยังเข้าถึง inode ผ่านตัวจัดการไฟล์ชั่วคราวของมันเอง นี่คือกลไกที่ช่วยให้คุณสามารถอัปเดตแพ็คเกจในขณะที่ซอฟต์แวร์นั้นทำงานอยู่ อย่างไรก็ตามเช่น NTFS ไม่มีคุณสมบัติดังกล่าว อย่างไรก็ตามอาจไม่เคยได้รับการแก้ไขโดยสองกระบวนการที่เกิดขึ้นพร้อมกันดังนั้นมันจะถูกบล็อกอย่างใดอย่างหนึ่งสำหรับผู้อื่น


ไม่เป็นความจริงทั้งหมดสำหรับ python3 !!
Jacob Vlijm

@JacobVlijm คุณคิดจะอธิบายไหม?
ผู้บัญชาการไบต์

ดูความคิดเห็นด้านล่างคำถาม คำตอบเกี่ยวกับ "การปฏิบัติที่ไม่ดี" ในลิงก์ของคำตอบของคุณมาจาก 2011 หากเคยมีอยู่คำเตือนpython3จะไม่มีอยู่อีกต่อไปและคำตอบนั้นล้าสมัยแล้ว มีการรวบรวมขยะอัตโนมัติด้วยเหตุผลและทำงานได้อย่างสมบูรณ์ เป็นเวลาหลายปีแล้วที่ฉันใช้มันclose()โดยเฉพาะ ไม่เคยพบข้อผิดพลาดเดียวที่เกิดจากการไม่ใช้งาน
Jacob Vlijm

ซู ... คุณรู้หรือไม่ว่าการใช้งานอื่น ๆ เช่นไฟล์ปิด PyPy, Jython หรือ IronPython แบบเดียวกับที่ CPython ทำ และถ้าฉันฆ่าล่ามมันจะไม่มีโอกาสปิดไฟล์ใช่มั้ย และฉันก็คิดว่าการ จำกัด การเปิดไฟล์ยังคงมีผลอยู่ สิ่งที่เกี่ยวกับการล้างข้อมูลที่เขียน? คุณรู้อะไรมากไปกว่านั้น
ผู้บัญชาการไบต์

1
@JacobVlijm ขอบคุณสำหรับเคล็ดลับ : P เครื่องของฉันล้มเหลวแล้วในขณะที่สร้างไฟล์นั้น ... ฉันไม่ต้องการแม้แต่ Python
ผู้บัญชาการไบต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.