Python - เมื่อใดควรใช้ไฟล์เปิด


138

ความแตกต่างระหว่างfileและopenในงูใหญ่คืออะไร? เมื่อใดที่ฉันควรใช้อันไหน (บอกว่าฉันอยู่ใน 2.5)

คำตอบ:


153

open()คุณควรใช้

ตามที่ระบุในเอกสาร :

เมื่อเปิดไฟล์ควรใช้ open () แทนการเรียก constructor นี้โดยตรง ไฟล์มีความเหมาะสมมากกว่าในการพิมพ์การทดสอบ (ตัวอย่างเช่นการเขียน "isinstance (f, file)")

และfile() ถูกลบไปตั้งแต่ Python 3.0


23
นี่เป็นเรื่องที่น่าวิตกเนื่องจากเอกสารที่ใช้ในการระบุ "ตัวสร้างไฟล์ () เป็นของใหม่ใน Python 2.2 การสะกดคำก่อนหน้านี้ open () ถูกเก็บไว้เพื่อความเข้ากันได้และเป็นนามแฝงสำหรับไฟล์ ()" ตั้งแต่ฉันตัดสินใจ RTFM เมื่อสิบปีที่แล้วและชอบการรวมประเภทและคลาสฉันจึงไม่เคยใช้ open () อีกครั้ง ยิ่งกว่านั้นฉันยังรู้สึกว่าตัวสร้างประเภทเป็นวิธีที่ชัดเจนกว่าในการส่งคืนไฟล์เช่นวัตถุซึ่งอยู่ที่พา ธ ARGG และทำงานตามที่ร้องขอในโหมด ARG ฉันรู้สึกแบบนี้โดยเฉพาะอย่างยิ่งเมื่อความตั้งใจที่ชัดเจนของ devs ย้อนกลับไปแล้วคือ 2 รักษา open4compat
umeboshi

32

สองเหตุผล: ปรัชญาของงูใหญ่ "มีทางหนึ่งที่ควรทำ" และfileกำลังจะหายไป

fileเป็นประเภทที่แท้จริง (ใช้เช่นfile('myfile.txt')กำลังเรียกตัวสร้าง) openเป็นฟังก์ชั่นจากโรงงานที่จะคืนค่าวัตถุไฟล์

ใน python 3.0 fileกำลังจะย้ายจากการเป็นบิวด์อินไปสู่การใช้งานโดยหลายคลาสในioไลบรารี (ค่อนข้างคล้ายกับ Java ที่มีตัวอ่านบัฟเฟอร์ ฯลฯ )


3
เหตุผลสองประการคืออะไร
Matt

19

file()เป็นประเภทเช่น int หรือรายการ open()เป็นฟังก์ชั่นสำหรับเปิดไฟล์และจะส่งคืนfileวัตถุ

นี่คือตัวอย่างของเวลาที่คุณควรใช้ open:

f = open(filename, 'r')
for line in f:
    process(line)
f.close()

นี่คือตัวอย่างของเวลาที่คุณควรใช้ไฟล์:

class LoggingFile(file):
    def write(self, data):
        sys.stderr.write("Wrote %d bytes\n" % len(data))
        super(LoggingFile, self).write(data)

อย่างที่คุณเห็นมีเหตุผลที่ดีสำหรับทั้งคู่และการใช้งานที่ชัดเจนสำหรับทั้งสองกรณี


5
โดยทั่วไปไฟล์ควรเปิดด้วยwithคำสั่ง with open(filename, 'r') as f: \ for line in f: \ process(line). นี่เป็นการหลีกเลี่ยงการปิดอย่างชัดเจน Python 2.6 ขึ้นไปสนับสนุนการwithประกาศอย่างเป็นทางการ ใน Python 2.5 คุณจะต้องเพิ่มfrom __future__ import with_statementรหัสด้านบนลงไป
IceArdor

คุณไม่ได้กำหนดชื่อบิวด์อินอีกครั้งในตัวอย่างที่สองใช่ไหม
planetp

1
@planetp ตัวอย่างที่สองเพิ่งสืบทอดมาจากคลาสไฟล์ ฉันคิดว่ามันแปลกที่มันเป็นตัวพิมพ์เล็ก แต่นั่นเป็นวิธีที่มันใช้กับชนิด
บิวอิน

1
ใน Python 2.5 fileคลาสนั้นมีวิธีพิเศษที่จะเรียกโดยอัตโนมัติเมื่อใดก็ตามที่ไฟล์ถูกเปิดผ่านwithคำสั่ง วิธีพิเศษเหล่านี้ทำให้มั่นใจได้ว่าไฟล์จะเปิดและปิดอย่างถูกต้องและปลอดภัย
Mausy5043

7

หน้าที่ทั้งสองเหมือนกัน openจะโทรfileต่อไปดังนั้นความแตกต่างในปัจจุบันจึงเป็นเรื่องของสไตล์ เอกสารงูใหญ่openแนะนำให้ใช้

เมื่อเปิดไฟล์ควรใช้ open () แทนที่จะเรียกใช้ตัวสร้างไฟล์โดยตรง

เหตุผลก็คือในรุ่นอนาคตพวกเขาจะไม่รับประกันว่าจะเหมือนเดิม ( openจะกลายเป็นฟังก์ชั่นโรงงานซึ่งจะส่งคืนวัตถุประเภทต่าง ๆ ขึ้นอยู่กับเส้นทางที่เปิด)


2
เปิดฟังก์ชั่นที่มีอยู่แล้วในโรงงานเพื่อให้มีความแตกต่างการทำงาน (เช่นมรดก isinstance () ฯลฯ .)
ไบรอัน

4

ใช้ open () เพื่อเปิดไฟล์เท่านั้น ไฟล์ () กำลังถูกลบใน 3.0 และเลิกใช้แล้วในขณะนี้ พวกเขามีความสัมพันธ์แปลก ๆ แต่ตอนนี้ไฟล์ () กำลังดำเนินไปดังนั้นไม่จำเป็นต้องกังวลอีกต่อไป

ต่อไปนี้มาจากเอกสาร Python 2.6 [สิ่งวงเล็บ] เพิ่มโดยฉัน

เมื่อเปิดไฟล์ควรใช้ open () แทนที่จะเรียกใช้ constructor [file ()] นี้โดยตรง ไฟล์เหมาะสำหรับการพิมพ์ทดสอบมากขึ้น (เช่นการเขียน isinstance (f, file)


2

จากคำกล่าวของ Mr Van Rossum ถึงแม้ว่า open () เป็นชื่อแทนของไฟล์ () คุณควรใช้ open () เพราะอาจมีการเปลี่ยนแปลงในอนาคต

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