Python - Kapan menggunakan file vs terbuka

138

Apa perbedaan antara filedan opendalam Python? Kapan saya harus menggunakan yang mana? (Katakan saya di 2.5)

Greg
sumber

Jawaban:

153

Anda harus selalu menggunakannya open().

Seperti yang dinyatakan dalam dokumentasi :

Saat membuka file, lebih baik menggunakan open () daripada memanggil konstruktor ini secara langsung. file lebih cocok untuk mengetik pengujian (misalnya, menulis "isinstance (f, file)").

Juga, file() telah dihapus sejak Python 3.0.

nosklo
sumber
23
Ini menyedihkan, karena dokumentasi yang digunakan untuk menyatakan "Konstruktor file () baru dalam Python 2.2. Ejaan sebelumnya, buka (), dipertahankan untuk kompatibilitas, dan merupakan alias untuk file ()." Sejak saya memutuskan untuk RTFM sepuluh tahun yang lalu, dan menjadi sangat menyukai penyatuan jenis dan kelas, saya tidak pernah menggunakan open () lagi. Selain itu, saya masih merasa bahwa konstruktor tipe adalah cara yang lebih jelas untuk mengembalikan file seperti objek, terletak oleh path arg, dan berperilaku seperti yang diminta dalam mode arg. Saya terutama merasa seperti ini ketika niat yang jelas dari para devs saat itu adalah 2 mempertahankan open4compat.
umeboshi
32

Dua alasan: Filsafat python "Seharusnya ada satu cara untuk melakukannya" dan fileakan hilang.

fileadalah tipe aktual (menggunakan mis. file('myfile.txt')memanggil konstruktornya). openadalah fungsi pabrik yang akan mengembalikan objek file.

Dalam python 3.0 fileakan beralih dari built-in menjadi diterapkan oleh beberapa kelas di ioperpustakaan (agak mirip dengan Java dengan pembaca buffer, dll.)

Ryan
sumber
3
Dua alasan untuk apa?
Mat
19

file()adalah tipe, seperti int atau daftar. open()adalah fungsi untuk membuka file, dan akan mengembalikan fileobjek.

Ini adalah contoh kapan Anda harus menggunakan open:

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

Ini adalah contoh kapan Anda harus menggunakan file:

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

Seperti yang Anda lihat, ada alasan bagus untuk keduanya ada, dan penggunaan yang jelas untuk keduanya.

Jerub
sumber
5
Secara umum, file harus dibuka dengan withpernyataan. with open(filename, 'r') as f: \ for line in f: \ process(line). Ini menghindari penutupan eksplisit. Python 2.6 dan di atas secara alami mendukung withpernyataan itu. Di Python 2.5, Anda harus menambahkan from __future__ import with_statementke bagian atas kode Anda.
IceArdor
Bukankah Anda baru saja mendefinisikan ulang nama bawaan pada contoh kedua?
planetp
1
@planetp, contoh kedua baru saja diturunkan dari kelas file. Saya kira itu aneh bahwa itu dalam huruf kecil, tapi begitulah dengan tipe builtin dasar (misalnya objek, str, daftar, ...)
yoniLavi
1
Dalam Python 2.5, filekelas itu dilengkapi dengan metode khusus yang secara otomatis dipanggil setiap kali file dibuka melalui withpernyataan. Metode khusus ini memastikan bahwa file dibuka dan ditutup dengan benar dan aman.
Mausy5043
7

Secara fungsional, keduanya sama; openakan filetetap menelepon , jadi saat ini perbedaannya adalah masalah gaya. The Python docs menyarankan menggunakan open.

Saat membuka file, lebih baik menggunakan open () daripada memanggil konstruktor file secara langsung.

Alasannya adalah bahwa dalam versi yang akan datang mereka tidak dijamin sama ( openakan menjadi fungsi pabrik, yang mengembalikan objek dari berbagai jenis tergantung pada jalur yang dibuka).

dF.
sumber
2
open sudah merupakan fungsi pabrik, jadi ada perbedaan fungsional (mis. pewarisan, isinstance () dll)
Brian
4

Hanya gunakan open () untuk membuka file. file () sebenarnya sedang dihapus di 3.0, dan saat ini sudah tidak digunakan lagi. Mereka memiliki semacam hubungan aneh, tetapi file () sedang berjalan, jadi tidak perlu khawatir lagi.

Berikut ini adalah dari dokumen Python 2.6. [braket] ditambahkan oleh saya.

Saat membuka file, lebih baik menggunakan open () alih-alih memanggil konstruktor [file ()] ini secara langsung. file lebih cocok untuk mengetik pengujian (misalnya, menulis isinstance (f, file)

Devin Jeanpierre
sumber
2

Menurut Tn. Van Rossum, meskipun open () saat ini adalah alias untuk file () Anda harus menggunakan open () karena ini mungkin berubah di masa depan.

Martin Beckett
sumber