Python - Quando utilizzare file vs open


138

Qual è la differenza tra filee openin Python? Quando dovrei usare quale? (Di 'che sono in 2.5)

Risposte:


153

Dovresti sempre usare open().

Come indica la documentazione :

Quando si apre un file, è preferibile utilizzare open () invece di richiamare direttamente questo costruttore. il file è più adatto al test di tipo (ad esempio, scrivendo "isinstance (f, file)").

Inoltre, file() è stato rimosso da Python 3.0.


23
Questo è angosciante, poiché la documentazione utilizzata per indicare "Il costruttore file () è nuovo in Python 2.2. L'ortografia precedente, open (), viene mantenuta per compatibilità ed è un alias per file ()." Da quando ho deciso di RTFM dieci anni fa e mi sono appassionato all'unificazione di tipi e classi, non ho mai più usato open (). Inoltre, ritengo ancora che il costruttore del tipo sia il modo più ovvio per restituire un file come un oggetto, situato sul percorso arg, e comportarsi come richiesto nella modalità arg. Mi sento particolarmente così quando l'ovvio intento degli sviluppatori di allora era 2 trattenere open4compat.
umeboshi,

32

Due ragioni: la filosofia pitone di "Dovrebbe esserci un modo per farlo" e filesta andando via.

fileè il tipo effettivo (usando ad esempio file('myfile.txt')si chiama il suo costruttore). openè una funzione di fabbrica che restituirà un oggetto file.

In python 3.0 filepasserà dall'essere un built-in all'implementazione da più classi nella iolibreria (in qualche modo simile a Java con lettori bufferizzati, ecc.)


3
Due ragioni per cosa?
Matt

19

file()è un tipo, come un int o un elenco. open()è una funzione per aprire i file e restituirà un fileoggetto.

Questo è un esempio di quando dovresti usare open:

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

Questo è un esempio di quando dovresti usare il file:

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

Come puoi vedere, c'è una buona ragione per esistere entrambi e un chiaro caso d'uso per entrambi.


5
Generalmente, i file dovrebbero essere aperti con l' withistruzione. with open(filename, 'r') as f: \ for line in f: \ process(line). Questo evita la chiusura esplicita. Python 2.6 e versioni successive supportano nativamente l' withistruzione. In Python 2.5, è necessario aggiungere from __future__ import with_statementall'inizio del codice.
IceArdor,

Non hai semplicemente ridefinito il nome integrato nel secondo esempio?
planetp,

1
@planetp, il secondo esempio eredita dalla classe file. Suppongo sia strano che sia in minuscolo, ma è così con i tipi di base incorporati (ad esempio oggetto, str, elenco, ...)
yoniLavi,

1
In Python 2.5, la fileclasse era dotata di metodi speciali che vengono chiamati automaticamente ogni volta che un file viene aperto tramite withun'istruzione. Questi metodi speciali assicurano che il file sia aperto e chiuso in modo corretto e sicuro.
Mausy5043,

7

Funzionalmente, i due sono gli stessi; openchiamerà filecomunque, quindi attualmente la differenza è una questione di stile. I documenti Python consigliano di utilizzare open.

Quando si apre un file, è preferibile utilizzare open () invece di richiamare direttamente il costruttore del file.

Il motivo è che nelle versioni future non è garantito che siano uguali ( opendiventerà una funzione di fabbrica, che restituisce oggetti di diverso tipo a seconda del percorso che sta aprendo).


2
open è già una funzione di fabbrica, quindi ci sono differenze funzionali (es. ereditarietà, isinstance () ecc.)
Brian

4

Usa sempre open () per aprire i file. file () viene effettivamente rimosso in 3.0, ed è deprecato al momento. Hanno avuto una sorta di strana relazione, ma file () sta andando ora, quindi non c'è più bisogno di preoccuparsi.

Quanto segue proviene dai documenti di Python 2.6. [parentesi quadre] aggiunta da me.

Quando si apre un file, è preferibile utilizzare open () invece di richiamare direttamente questo costruttore [file ()]. il file è più adatto al test di tipo (ad esempio, la scrittura di isinstance (f, file)


2

Secondo l'onorevole Van Rossum, sebbene open () sia attualmente un alias per file () dovresti usare open () perché questo potrebbe cambiare in futuro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.