ความแตกต่างระหว่างfileและopenในงูใหญ่คืออะไร? เมื่อใดที่ฉันควรใช้อันไหน (บอกว่าฉันอยู่ใน 2.5)
ความแตกต่างระหว่างfileและopenในงูใหญ่คืออะไร? เมื่อใดที่ฉันควรใช้อันไหน (บอกว่าฉันอยู่ใน 2.5)
คำตอบ:
open()คุณควรใช้
ตามที่ระบุในเอกสาร :
เมื่อเปิดไฟล์ควรใช้ open () แทนการเรียก constructor นี้โดยตรง ไฟล์มีความเหมาะสมมากกว่าในการพิมพ์การทดสอบ (ตัวอย่างเช่นการเขียน "isinstance (f, file)")
และfile() ถูกลบไปตั้งแต่ Python 3.0
สองเหตุผล: ปรัชญาของงูใหญ่ "มีทางหนึ่งที่ควรทำ" และfileกำลังจะหายไป
fileเป็นประเภทที่แท้จริง (ใช้เช่นfile('myfile.txt')กำลังเรียกตัวสร้าง) openเป็นฟังก์ชั่นจากโรงงานที่จะคืนค่าวัตถุไฟล์
ใน python 3.0 fileกำลังจะย้ายจากการเป็นบิวด์อินไปสู่การใช้งานโดยหลายคลาสในioไลบรารี (ค่อนข้างคล้ายกับ Java ที่มีตัวอ่านบัฟเฟอร์ ฯลฯ )
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)
อย่างที่คุณเห็นมีเหตุผลที่ดีสำหรับทั้งคู่และการใช้งานที่ชัดเจนสำหรับทั้งสองกรณี
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รหัสด้านบนลงไป
fileคลาสนั้นมีวิธีพิเศษที่จะเรียกโดยอัตโนมัติเมื่อใดก็ตามที่ไฟล์ถูกเปิดผ่านwithคำสั่ง วิธีพิเศษเหล่านี้ทำให้มั่นใจได้ว่าไฟล์จะเปิดและปิดอย่างถูกต้องและปลอดภัย
หน้าที่ทั้งสองเหมือนกัน openจะโทรfileต่อไปดังนั้นความแตกต่างในปัจจุบันจึงเป็นเรื่องของสไตล์ เอกสารงูใหญ่openแนะนำให้ใช้
เมื่อเปิดไฟล์ควรใช้ open () แทนที่จะเรียกใช้ตัวสร้างไฟล์โดยตรง
เหตุผลก็คือในรุ่นอนาคตพวกเขาจะไม่รับประกันว่าจะเหมือนเดิม ( openจะกลายเป็นฟังก์ชั่นโรงงานซึ่งจะส่งคืนวัตถุประเภทต่าง ๆ ขึ้นอยู่กับเส้นทางที่เปิด)
ใช้ open () เพื่อเปิดไฟล์เท่านั้น ไฟล์ () กำลังถูกลบใน 3.0 และเลิกใช้แล้วในขณะนี้ พวกเขามีความสัมพันธ์แปลก ๆ แต่ตอนนี้ไฟล์ () กำลังดำเนินไปดังนั้นไม่จำเป็นต้องกังวลอีกต่อไป
ต่อไปนี้มาจากเอกสาร Python 2.6 [สิ่งวงเล็บ] เพิ่มโดยฉัน
เมื่อเปิดไฟล์ควรใช้ open () แทนที่จะเรียกใช้ constructor [file ()] นี้โดยตรง ไฟล์เหมาะสำหรับการพิมพ์ทดสอบมากขึ้น (เช่นการเขียน isinstance (f, file)
จากคำกล่าวของ Mr Van Rossum ถึงแม้ว่า open () เป็นชื่อแทนของไฟล์ () คุณควรใช้ open () เพราะอาจมีการเปลี่ยนแปลงในอนาคต