Python: cuándo usar el archivo frente a abrir

138

¿Cuál es la diferencia entre filey openen Python? ¿Cuándo debo usar cuál? (Digamos que estoy en 2.5)

Greg
fuente

Respuestas:

153

Siempre debes usar open().

Como dice la documentación :

Al abrir un archivo, es preferible usar open () en lugar de invocar este constructor directamente. El archivo es más adecuado para las pruebas de tipo (por ejemplo, escribir "isinstance (f, file)").

Además, file() se ha eliminado desde Python 3.0.

nosklo
fuente
23
Esto es angustiante, ya que la documentación utilizada para indicar "El constructor file () es nuevo en Python 2.2. La ortografía anterior, open (), se conserva por compatibilidad y es un alias para file ()". Desde que decidí RTFM hace diez años, y me gustó mucho la unificación de tipos y clases, nunca volví a usar open (). Además, sigo sintiendo que el constructor de tipos es la forma más obvia de devolver un archivo como objeto, ubicado por la ruta arg, y comportándose como se solicita en el modo arg. Me siento especialmente así cuando la intención obvia de los desarrolladores en ese entonces era 2 retener open4compat.
umeboshi
32

Dos razones: la filosofía de pitón de "Debería haber una forma de hacerlo" y fileestá desapareciendo.

filees el tipo real (usando, por ejemplo, file('myfile.txt')está llamando a su constructor). openes una función de fábrica que devolverá un objeto de archivo.

En python 3.0, filese pasará de ser integrado a implementado por múltiples clases en la iobiblioteca (algo similar a Java con lectores almacenados en búfer, etc.)

Ryan
fuente
3
¿Dos razones para qué?
Matt
19

file()es un tipo, como un int o una lista. open()es una función para abrir archivos y devolverá un fileobjeto.

Este es un ejemplo de cuándo debe usar open:

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

Este es un ejemplo de cuándo debe usar el archivo:

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

Como puede ver, hay una buena razón para que ambos existan, y un claro caso de uso para ambos.

Jerub
fuente
55
En general, los archivos deben abrirse con la withdeclaración. with open(filename, 'r') as f: \ for line in f: \ process(line). Esto evita el cierre explícito. Python 2.6 y superior admiten de forma nativa la withdeclaración. En Python 2.5, debe agregar from __future__ import with_statementa la parte superior de su código.
IceArdor
¿No acabas de redefinir el nombre incorporado en el segundo ejemplo?
planetp
1
@planetp, el segundo ejemplo simplemente hereda de la clase de archivo. Supongo que es extraño que esté en minúsculas, pero así es con los tipos básicos integrados (por ejemplo, objeto, str, lista, ...)
yoniLavi
1
En Python 2.5, la fileclase estaba equipada con métodos especiales que se llaman automáticamente cada vez que se abre un archivo a través de una withdeclaración. Estos métodos especiales aseguran que el archivo se abra y cierre de manera adecuada y segura.
Mausy5043
7

Funcionalmente, los dos son iguales; openllamará de filetodos modos, por lo que actualmente la diferencia es una cuestión de estilo. Los documentos de Python recomiendan usar open.

Al abrir un archivo, es preferible usar open () en lugar de invocar el constructor de archivos directamente.

La razón es que en versiones futuras no se garantiza que sean iguales ( opense convertirá en una función de fábrica, que devuelve objetos de diferentes tipos dependiendo de la ruta que se está abriendo).

dF.
fuente
2
open ya es una función de fábrica, por lo que existen diferencias funcionales (p. ej. herencia, isinstance (), etc.)
Brian
4

Solo use open () para abrir archivos. file () en realidad se está eliminando en 3.0, y está en desuso en este momento. Han tenido una especie de relación extraña, pero file () se está ejecutando ahora, por lo que ya no hay que preocuparse.

Lo siguiente es de los documentos de Python 2.6. [material de soporte] agregado por mí.

Al abrir un archivo, es preferible usar open () en lugar de invocar este constructor [file ()] directamente. El archivo es más adecuado para las pruebas de tipo (por ejemplo, escribir isinstance (f, file)

Devin Jeanpierre
fuente
2

Según el Sr. Van Rossum, aunque open () es actualmente un alias para file (), debe usar open () porque esto podría cambiar en el futuro.

Martin Beckett
fuente