Python - Wann wird Datei gegen Öffnen verwendet?

138

Was ist der Unterschied zwischen fileund openin Python? Wann soll ich welche verwenden? (Angenommen, ich bin in 2.5)

Greg
quelle

Antworten:

153

Sie sollten immer verwenden open().

Wie in der Dokumentation angegeben :

Beim Öffnen einer Datei ist es vorzuziehen, open () zu verwenden, anstatt diesen Konstruktor direkt aufzurufen. Datei eignet sich eher zum Typentest (z. B. Schreiben von "isinstance (f, file)").

Auch file() wurde entfernt , da Python 3.0.

nosklo
quelle
23
Dies ist beunruhigend, da in der Dokumentation angegeben wird, dass der Konstruktor file () in Python 2.2 neu ist. Die vorherige Schreibweise open () wird aus Kompatibilitätsgründen beibehalten und ist ein Alias ​​für file (). Seit ich mich vor zehn Jahren für RTFM entschieden habe und die Vereinheitlichung von Typen und Klassen sehr mochte, habe ich open () nie wieder verwendet. Darüber hinaus bin ich immer noch der Meinung, dass der Typkonstruktor der naheliegendste Weg ist, ein dateiähnliches Objekt zurückzugeben, das sich am Pfad arg befindet und sich wie im Modus arg angefordert verhält. Ich fühle mich besonders so, als die offensichtliche Absicht der Entwickler damals war, open4compat beizubehalten.
Umeboshi
32

Zwei Gründe: Die Python-Philosophie "Es sollte einen Weg geben, dies zu tun" und file geht verloren.

fileist der tatsächliche Typ (mit z. B. file('myfile.txt')wird der Konstruktor aufgerufen).openist eine Factory-Funktion, die ein Dateiobjekt zurückgibt.

In Python 3.0 filewird es von einer integrierten Version zu einer Implementierung durch mehrere Klassen in der ioBibliothek übergehen (ähnlich wie Java mit gepufferten Lesegeräten usw.).

Ryan
quelle
3
Zwei Gründe für was?
Matt
19

file()ist ein Typ wie ein Int oder eine Liste. open()ist eine Funktion zum Öffnen von Dateien und gibt a zurückfile Objekt zurück.

Dies ist ein Beispiel dafür, wann Sie open verwenden sollten:

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

Dies ist ein Beispiel dafür, wann Sie file verwenden sollten:

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

Wie Sie sehen, gibt es einen guten Grund für beide und einen klaren Anwendungsfall für beide.

Jerub
quelle
5
Im Allgemeinen sollten Dateien mit der withAnweisung geöffnet werden . with open(filename, 'r') as f: \ for line in f: \ process(line). Dies vermeidet das explizite Schließen. Python 2.6 und höher unterstützen die withAnweisung nativ . In Python 2.5 müssen Sie from __future__ import with_statementden Anfang Ihres Codes hinzufügen .
IceArdor
Haben Sie den integrierten Namen im zweiten Beispiel nicht neu definiert?
Planetp
1
@planetp, das zweite Beispiel erbt nur von der Dateiklasse. Ich nehme an, es ist seltsam, dass es in Kleinbuchstaben geschrieben ist, aber so ist es mit den grundlegenden eingebauten Typen (z. B. Objekt, Str, Liste, ...)
yoniLavi
1
In Python 2.5 wurde die fileKlasse mit speziellen Methoden ausgestattet, die automatisch aufgerufen werden, wenn eine Datei über eine withAnweisung geöffnet wird . Diese speziellen Methoden stellen sicher, dass die Datei ordnungsgemäß und sicher geöffnet und geschlossen wird.
Mausy5043
7

Funktionell sind die beiden gleich; openwird filesowieso anrufen , daher ist der Unterschied derzeit eine Frage des Stils. In den Python-Dokumenten wird die Verwendung empfohlen open.

Beim Öffnen einer Datei ist es vorzuziehen, open () zu verwenden, anstatt den Dateikonstruktor direkt aufzurufen.

Der Grund dafür ist, dass in zukünftigen Versionen nicht garantiert wird, dass sie gleich sind ( openwird zu einer Factory-Funktion, die je nach geöffnetem Pfad Objekte unterschiedlichen Typs zurückgibt).

dF.
quelle
2
open ist bereits eine Factory-Funktion, daher gibt es funktionale Unterschiede (z. B. Vererbung, isinstance () usw.)
Brian
4

Verwenden Sie open () immer nur zum Öffnen von Dateien. file () wird in 3.0 tatsächlich entfernt und ist derzeit veraltet. Sie hatten eine seltsame Beziehung, aber file () läuft jetzt, sodass Sie sich keine Sorgen mehr machen müssen.

Das Folgende stammt aus den Python 2.6-Dokumenten. [Klammer Zeug] von mir hinzugefügt.

Beim Öffnen einer Datei ist es vorzuziehen, open () zu verwenden, anstatt diesen Konstruktor [file ()] direkt aufzurufen. Datei eignet sich besser für Typprüfungen (z. B. Schreiben von isinstance (f, Datei)

Devin Jeanpierre
quelle
2

Laut Van Rossum sollten Sie open () verwenden, obwohl open () derzeit ein Alias ​​für file () ist, da sich dies in Zukunft ändern könnte.

Martin Beckett
quelle