141 votes

Python - Quand utiliser "file" ou "open" ?

Quelle est la différence entre file y open en Python ? Quand dois-je utiliser l'un ou l'autre ? (Disons que je suis en 2.5)

157voto

nosklo Points 75862

Vous devez toujours utiliser open() .

Comme le documentation États :

Lors de l'ouverture d'un fichier, il est préférable de d'utiliser open() plutôt que d'invoquer cette fonction directement ce constructeur. file est plus adapté aux tests de type (par exemple, écrire "isinstance(f, file)").

Aussi, file() a été supprimé depuis Python 3.0.

23 votes

C'est désolant, car la documentation indiquait auparavant "Le constructeur file() est nouveau dans Python 2.2. L'orthographe précédente, open(), est conservée pour des raisons de compatibilité, et est un alias pour file()." Depuis que j'ai décidé de RTFM il y a dix ans, et que je suis devenu très friand de l'unification des types et des classes, je n'ai plus jamais utilisé open(). De plus, je pense toujours que le constructeur de type est le moyen le plus évident de retourner un objet de type fichier, localisé par l'argument path, et se comportant comme demandé dans l'argument mode. Je suis particulièrement de cet avis lorsque l'intention évidente des développeurs de l'époque était de conserver open4compat.

33voto

Ryan Points 7423

Deux raisons : La philosophie python "Il devrait y avoir une seule façon de faire" et file s'en va.

file est le type réel (en utilisant par exemple file('myfile.txt') appelle son constructeur). open est une fonction d'usine qui retournera un objet fichier.

En python 3.0 file va passer du statut d'élément intégré à celui d'élément implémenté par plusieurs classes dans l'environnement de l'UE. io (quelque peu similaire à Java avec des lecteurs en mémoire tampon, etc.)

3 votes

Deux raisons pour quoi ?

19voto

Jerub Points 17488

file() est un type, comme un int ou une liste. open() est une fonction d'ouverture de fichiers, et renvoie un fichier file objet.

C'est un exemple de cas où vous devez utiliser "open" :

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

C'est un exemple de cas où vous devez utiliser file :

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

Comme vous pouvez le constater, il y a une bonne raison pour que les deux existent, et un cas d'utilisation clair pour les deux.

5 votes

En général, les fichiers doivent être ouverts avec la commande with déclaration. with open(filename, 'r') as f: \ for line in f: \ process(line) . Cela permet d'éviter la fermeture explicite. Python 2.6 et plus supporte nativement l'option with déclaration. Dans Python 2.5, vous devez ajouter l'instruction from __future__ import with_statement en haut de votre code.

0 votes

N'avez-vous pas simplement redéfini le nom intégré dans le deuxième exemple ?

1 votes

@planetp, le deuxième exemple hérite simplement de la classe fichier. Je suppose que c'est bizarre que ce soit en minuscules, mais c'est comme ça avec les types de base intégrés (par exemple object, str, list, ...).

7voto

dF. Points 29787

Fonctionnellement, les deux sont identiques ; open appellera file de toute façon, donc actuellement la différence est une question de style. Le site Documentation Python recommande d'utiliser open .

Pour ouvrir un fichier, il est préférable d'utiliser open() plutôt que d'invoquer directement le constructeur de fichier.

La raison en est que dans les versions futures, il n'est pas garanti qu'ils soient les mêmes ( open deviendra une fonction usine, qui renvoie des objets de différents types selon le chemin qu'elle ouvre).

2 votes

Open est déjà une fonction d'usine, il y a donc des différences fonctionnelles (par exemple, l'héritage, isinstance(), etc).

4voto

Devin Jeanpierre Points 23162

N'utilisez jamais open() que pour ouvrir des fichiers. file() est en fait supprimé dans la version 3.0, et il est déprécié pour le moment. Ils ont eu une sorte de relation étrange, mais file() est en train de disparaître, il n'y a donc plus lieu de s'inquiéter.

Ce qui suit est tiré de la documentation de Python 2.6. Les [crochets] ont été ajoutés par moi.

Pour ouvrir un fichier, il est préférable d'utiliser open() plutôt que d'invoquer directement ce constructeur [file()]. file est plus adapté aux tests de type (par exemple, écrire isinstance(f, file)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X