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)

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.


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


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.


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


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)


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.