Python - Quand utiliser un fichier ou ouvrir

138

Quelle est la différence entre fileet openen Python? Quand devrais-je utiliser lequel? (Dis que je suis en 2.5)

Greg
la source

Réponses:

153

Vous devriez toujours utiliser open().

Comme l'indique la documentation :

Lors de l'ouverture d'un fichier, il est préférable d'utiliser open () au lieu d'appeler directement ce constructeur. file est plus adapté au test de type (par exemple, écrire "isinstance (f, file)").

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

nosklo
la source
23
C'est affligeant, car la documentation utilisée pour déclarer "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 renvoyer un fichier comme un objet, localisé par le chemin arg, et se comportant comme demandé dans le mode arg. Je ressens particulièrement de cette manière lorsque l'intention évidente des développeurs à l'époque était de conserver open4compat.
umeboshi
32

Deux raisons: la philosophie python «Il devrait y avoir une façon de le faire» et filedisparaît.

fileest le type réel (en utilisant eg file('myfile.txt')appelle son constructeur). openest une fonction de fabrique qui retournera un objet fichier.

En python 3.0 file va passer du statut intégré à l'implémentation par plusieurs classes de la iobibliothèque (un peu similaire à Java avec des lecteurs tamponnés, etc.)

Ryan
la source
3
Deux raisons pour quoi?
Matt
19

file()est un type, comme un int ou une liste. open()est une fonction pour ouvrir des fichiers, et retournera un fileobjet.

Voici un exemple de cas où vous devriez utiliser open:

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

Voici un exemple d'utilisation de 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 voir, il y a une bonne raison pour que les deux existent et un cas d'utilisation clair pour les deux.

Jerub
la source
5
En règle générale, les fichiers doivent être ouverts avec l' withinstruction. with open(filename, 'r') as f: \ for line in f: \ process(line). Cela évite la fermeture explicite. Python 2.6 et supérieur supportent nativement l' withinstruction. Dans Python 2.5, vous devez ajouter from __future__ import with_statementen haut de votre code.
IceArdor
N'avez-vous pas simplement redéfini le nom intégré dans le deuxième exemple?
planetp
1
@planetp, le deuxième exemple hérite simplement de la classe file. Je suppose que c'est bizarre que ce soit en minuscules, mais c'est comme ça avec les types intégrés de base (par exemple, objet, str, liste, ...)
yoniLavi
1
En Python 2.5, la fileclasse était équipée de méthodes spéciales qui sont automatiquement appelées chaque fois qu'un fichier est ouvert via une withinstruction. Ces méthodes spéciales garantissent que le fichier est ouvert et fermé correctement et en toute sécurité.
Mausy5043
7

Fonctionnellement, les deux sont identiques; openappellera de filetoute façon, donc actuellement la différence est une question de style. Les documents Python recommandent d'utiliseropen .

Lors de l'ouverture d'un fichier, il est préférable d'utiliser open () au lieu d'appeler directement le constructeur de fichier.

La raison en est que dans les versions futures, il n'est pas garanti qu'elles soient identiques ( opendeviendra une fonction d'usine, qui retourne des objets de types différents en fonction du chemin qu'il ouvre).

dF.
la source
2
open est déjà une fonction d'usine, il y a donc des différences fonctionnelles (par exemple l'héritage, isinstance () etc)
Brian
4

N'utilisez jamais open () que pour ouvrir des fichiers. file () est en cours de suppression dans la version 3.0, et est actuellement obsolète. Ils ont eu une sorte de relation étrange, mais file () va maintenant, donc il n'y a plus besoin de s'inquiéter.

Ce qui suit est extrait de la documentation Python 2.6. [support stuff] ajouté par moi.

Lors de l'ouverture d'un fichier, il est préférable d'utiliser open () au lieu d'appeler directement ce constructeur [file ()]. file est plus adapté au test de type (par exemple, l'écriture d'une instance (f, fichier)

Devin Jeanpierre
la source
2

Selon M. Van Rossum, bien qu'open () soit actuellement un alias pour file (), vous devriez utiliser open () car cela pourrait changer dans le futur.

Martin Beckett
la source