Python - kiedy używać file, a kiedy open

138

Jaka jest różnica między filei openw Pythonie? Kiedy należy użyć którego? (Powiedz, że jestem w 2.5)

Greg
źródło

Odpowiedzi:

153

Powinieneś zawsze używać open().

Jak podaje dokumentacja :

Podczas otwierania pliku lepiej jest użyć metody open () zamiast bezpośredniego wywoływania tego konstruktora. plik jest bardziej odpowiedni do testowania typu (na przykład zapis „isinstance (f, plik)”).

Ponadto, file() został usunięty , ponieważ Python 3.0.

nosklo
źródło
23
Jest to niepokojące, ponieważ w dokumentacji podano: „Konstruktor file () jest nowy w Pythonie 2.2. Poprzednia pisownia, open (), jest zachowywana w celu zachowania zgodności i jest aliasem dla file ()”. Odkąd zdecydowałem się na RTFM dziesięć lat temu i bardzo polubiłem ujednolicenie typów i klas, nigdy więcej nie użyłem open (). Co więcej, nadal uważam, że konstruktor typu jest bardziej oczywistym sposobem na zwrócenie pliku takiego jak obiekt, znajdującego się za ścieżką arg i zachowującego się zgodnie z żądaniem w trybie arg. Szczególnie czuję się w ten sposób, gdy oczywistym zamiarem twórców było 2 zachować open4compat.
umeboshi
32

Z dwóch powodów: filozofia Pythona „Powinien istnieć jeden sposób, aby to zrobić” i fileodchodzi.

filejest rzeczywistym typem (użycie np. file('myfile.txt')wywołuje jego konstruktor). openjest funkcją fabryczną, która zwraca obiekt pliku.

W Pythonie 3.0 fileprzejdzie od bycia wbudowanym do zaimplementowanego przez wiele klas w iobibliotece (trochę podobnie do Javy z buforowanymi czytnikami itp.)

Ryan
źródło
3
Z dwóch powodów?
Matt,
19

file()jest typem, takim jak int lub lista. open()jest funkcją do otwierania plików i zwróci fileobiekt.

Oto przykład, kiedy powinieneś używać open:

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

Oto przykład, kiedy powinieneś używać file:

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

Jak widać, istnieje dobry powód, dla którego istnieją oba, i jasny przypadek użycia obu.

Jerub
źródło
5
Generalnie pliki należy otwierać za pomocą withoświadczenia. with open(filename, 'r') as f: \ for line in f: \ process(line). Pozwala to uniknąć jawnego zamknięcia. Python 2.6 i nowsze wersje natywnie obsługują tę withinstrukcję. W Pythonie 2.5 musisz dodać from __future__ import with_statementna początku swojego kodu.
IceArdor,
Czy w drugim przykładzie nie przedefiniowałeś wbudowanej nazwy?
planetp
1
@planetp, drugi przykład dziedziczy po prostu z klasy pliku. Przypuszczam, że to dziwne, że jest
pisane
1
W Pythonie 2.5 fileklasa została wyposażona w specjalne metody, które są wywoływane automatycznie za każdym razem, gdy plik jest otwierany za pomocą withinstrukcji. Te specjalne metody zapewniają prawidłowe i bezpieczne otwieranie i zamykanie pliku.
Mausy5043
7

Funkcjonalnie te dwa są takie same; openi filetak zadzwonię , więc obecnie różnica jest kwestią stylu. Dokumentacja Pythona zaleca używanie open.

Podczas otwierania pliku lepiej jest użyć metody open () zamiast bezpośrednio wywoływać konstruktor plików.

Powodem jest to, że w przyszłych wersjach nie ma gwarancji, że będą takie same ( openstaną się funkcją fabryczną, która zwraca obiekty różnych typów w zależności od ścieżki, którą otwiera).

dF.
źródło
2
open jest już funkcją fabryczną, więc istnieją różnice funkcjonalne (np. dziedziczenie, isinstance () itp.)
Brian
4

Zawsze używaj metody open () do otwierania plików. file () jest obecnie usuwany w wersji 3.0 i obecnie jest przestarzały. Mieli dziwny związek, ale funkcja file () jest teraz dostępna, więc nie musisz się już martwić.

Poniższe informacje pochodzą z dokumentacji Pythona 2.6. [elementy wspornika] dodane przeze mnie.

Podczas otwierania pliku lepiej jest użyć metody open () zamiast bezpośredniego wywoływania tego konstruktora [file ()]. plik jest bardziej odpowiedni do testowania typu (na przykład zapisanie isinstance (f, plik)

Devin Jeanpierre
źródło
2

Według pana Van Rossuma, chociaż open () jest obecnie aliasem dla file (), powinieneś użyć open (), ponieważ może się to zmienić w przyszłości.

Martin Beckett
źródło