Python - Ne zaman dosya vs açık kullanılır


138

Python ile fileve openarasındaki fark nedir ? Hangisini ne zaman kullanmalıyım? (2.5 yaşımda olduğumu söyle)

Yanıtlar:


153

Her zaman kullanmalısın open().

Gibi belgeler devletler:

Bir dosyayı açarken, bu kurucuyu doğrudan çağırmak yerine open () kullanmak tercih edilir. dosyası tür testine daha uygundur (örneğin, "isinstance (f, file)" yazmak).

Ayrıca, Python 3.0'dan beri file() kaldırıldı .


23
"Dosya () yapıcısı Python 2.2'de yenidir. Önceki yazım, open (), uyumluluk için korunur ve dosya () için bir takma addır." On yıl önce RTFM'ye karar verdiğimden ve türlerin ve sınıfların birleşmesine çok düşkün olduğumdan, bir daha asla open () kullanmadım. Dahası, yine de tür yapıcısının, yol arg tarafından bulunan ve mod argümanında istendiği gibi davranan, nesne gibi bir dosya döndürmenin daha belirgin bir yolu olduğunu hissediyorum. Özellikle devs bariz niyeti açık opencompcompat 2 olduğunda bu şekilde hissediyorum.
umeboshi

32

İki neden: "Bunu yapmanın bir yolu olmalı" python felsefesi ortadan kalkıyor file.

filegerçek türdür (örn. kullanarak file('myfile.txt')yapıcısını çağırır). openbir dosya nesnesini döndürecek bir fabrika işlevidir.

Python 3.0'da file, yerleşik olmaktan iokütüphanedeki birden çok sınıf tarafından uygulanmaya (arabellekli okuyucularla Java'ya biraz benzer, vb.) Geçecek.


3
Ne için iki sebep var?
Matt

19

file()int veya liste gibi bir türdür. open()dosyaları açma işlevidir ve bir filenesne döndürür .

Bu ne zaman open kullanmanız gerektiğine bir örnektir:

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

Bu, ne zaman dosya kullanmanız gerektiğine bir örnektir:

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

Gördüğünüz gibi, her ikisinin de var olması için iyi bir neden ve her ikisi için de net bir kullanım örneği var.


5
Genellikle dosyalar withifadeyle açılmalıdır . with open(filename, 'r') as f: \ for line in f: \ process(line). Bu açık kapanışı önler. Python 2.6 ve üstü bu withifadeyi doğal olarak desteklemektedir . Python 2.5'te, from __future__ import with_statementkodunuzun en üstüne eklemeniz gerekir .
IceArdor

İkinci örnekte yerleşik adı yeniden tanımladınız mı?
planetp

1
@planetp, ikinci örnek sadece dosya sınıfından miras alır. Sanırım küçük harfte olması garip, ancak temel yerleşik
tiplerle

1
Python 2.5'te, filesınıf bir dosya bir withdeyim yoluyla açıldığında otomatik olarak çağrılan özel yöntemlerle donatılmıştır . Bu özel yöntemler dosyanın düzgün ve güvenli bir şekilde açılmasını ve kapatılmasını sağlar.
Mausy5043

7

İşlevsel olarak, ikisi aynıdır; Yine opende arayacak file, şu anda fark bir stil meselesi. Python dokümanlar kullanılmasını tavsiye open.

Bir dosyayı açarken, dosya yapıcısını doğrudan çağırmak yerine open () kullanmak tercih edilir.

Bunun nedeni, gelecekteki sürümlerde aynı olmalarının garanti edilmemesidir ( openaçtığı yola bağlı olarak farklı türdeki nesneleri döndüren bir fabrika işlevi haline gelecektir).


2
open zaten bir fabrika fonksiyonudur, bu nedenle fonksiyonel farklılıklar vardır (örn. kalıtım, isinstance () vb.)
Brian

4

Dosya açmak için sadece open () kullanın. file () aslında 3.0'da kaldırılıyor ve şu anda kullanımdan kaldırılıyor. Bir tür garip ilişki yaşadılar, ancak file () şimdi gidiyor, bu yüzden artık endişelenmenize gerek yok.

Aşağıdakiler Python 2.6 belgelerinden alınmıştır. [köşeli parantez] tarafımdan eklendi.

Bir dosyayı açarken, bu [file ()] yapıcısını doğrudan çağırmak yerine open () kullanmak tercih edilir. dosya tip testine daha uygundur (örneğin, isinstance (f, file) yazmak


2

Bay Van Rossum'a göre, open () şu anda file () için bir diğer ad olsa da, open () kullanmalısınız çünkü bu gelecekte değişebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.