Python - Kapan menggunakan file vs terbuka


138

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

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.


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.)


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.


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).


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)


2

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.