Il existe au moins deux façons d'écrire dans un fichier en python:

f = open(file, 'w')
f.write(string)

Ou

f = open(file, 'w')
print >> f, string     # in python 2
print(string, file=f)  # in python 3

Y a-t-il une différence entre les deux? Ou y en a-t-il un de plus Pythonic? J'essaie d'écrire un tas de code HTML dans un fichier, j'ai donc besoin d'un tas d'instructions d'écriture / d'impression dans mon fichier (mais je n'ai pas besoin d'un moteur de modèles).

42
oxuser 22 déc. 2011 à 04:50

7 réponses

Meilleure réponse

print fait les choses que file.write ne fait pas, vous permettant d'ignorer le formatage des chaînes pour certaines choses de base.

Il insère des espaces entre les arguments et ajoute le terminateur de ligne.

print "a", "b" # prints something like "a b\n"

Il appelle les méthodes spéciales __str__ ou __repr__ d'un objet pour le convertir en chaîne.

print 1 # prints something like "1\n"

Vous devez effectuer ces opérations manuellement si vous utilisez file.write au lieu de print.

34
agf 22 déc. 2011 à 01:00

Je suis en désaccord avec plusieurs des opinions exprimées ici, selon lesquelles print >> f est redondant et doit être évité en faveur de f.write.

print et file.write sont des opérations très différentes. file.write écrit directement une chaîne dans un fichier. print ressemble plus à "rendre les valeurs à stdout sous forme de texte". Naturellement, le résultat du rendu d'une chaîne sous forme de texte n'est que la chaîne, donc print >> f, my_string et f.write(my_string) sont presque interchangeables (sauf pour l'ajout d'une nouvelle ligne). Mais votre choix entre file.write et print devrait normalement être basé sur ce que vous faites; écrivez-vous une chaîne dans un fichier ou rendez-vous des valeurs dans un fichier?

Bien sûr, print n'est pas strictement nécessaire , dans la mesure où vous pouvez l'implémenter avec file.write. Mais alors file.write n'est pas strictement nécessaire, car vous pouvez l'implémenter avec les opérations dans os pour traiter les descripteurs de fichiers. En réalité, ce sont des opérations à différents niveaux, et vous devez utiliser celui qui convient le mieux à votre utilisation (normalement le niveau sur lequel travaille un autre code à proximité ou le niveau le plus élevé qui ne vous gêne pas).

Je pense que la syntaxe print >> f est assez horrible et est un très bon exemple de la raison pour laquelle print aurait dû être une fonction depuis le début. Ceci est beaucoup amélioré dans Python 3. Mais même si vous écrivez du code Python 2 que vous prévoyez de porter sur Python 3, il est beaucoup plus facile de convertir print >> f, thing1, thing2, thing3, ... en {{ X3}} que pour convertir la circonlocution où vous lancez votre propre code pour faire l'équivalent du rendu de print puis appelez f.write(text). Je suis presque sûr que le convertisseur semi-automatique de Python 2 à Python 3 fera même la conversion pour vous, ce qu'il ne pourrait pas faire si vous évitiez le formulaire print >> f.

Conclusion: utilisez print pour rendre les valeurs à stdout (ou à un fichier). Utilisez f.write pour écrire du texte dans un fichier.

17
Ben 22 déc. 2011 à 02:42

D'accord avec @agf

J'ai préféré print(..., file=f) en raison de sa flexibilité.

with open('test.txt', 'w') as f:
    print('str', file=f)
    print(1, 20, file=f)

Il est également facile de convertir la commande print existante.

write n'accepte que la chaîne.

2
wannik 13 oct. 2015 à 04:20

Vous ne devriez faire aucune de ces choses. La chose la plus pythonique à faire est d'utiliser la fonction d'impression Python 3 (par opposition à la instruction d'impression Python 2):

f = open(file, 'w')
print(string, file=f)

Bien sûr, la façon idéale de le faire est d'utiliser simplement Python 3. Mais si vous êtes bloqué en utilisant Python 2, vous pouvez l'activer en utilisant un future déclaration en haut du fichier:

from __future__ import print_function

Notez que cela change l'impression d'une autre manière, le plus évident étant que vous devez ajouter des crochets autour de ses arguments. Mais les changements sont tous des améliorations, ce qui est la raison principale du changement dans Python 3. Pendant que vous y êtes, envisagez d'utiliser toutes les futures instructions pour obtenir autant d'améliorations rétroportées de Python 3 que possible.

4
Jim Oldfield 20 août 2016 à 11:53

C'est la manière préférée, en utilisant des gestionnaires de contexte:

with open(file, 'w') as f:
  f.write(string)

Sur python 2, je préfère file.write car la syntaxe >> est déconseillée. Pour python 3, vous préférerez peut-être utiliser la fonction d'impression à la place, ce que vous devriez noter fait quelques choses supplémentaires (par exemple convertir automatiquement les nombres en chaînes pour vous, etc.).

1
wim 9 sept. 2013 à 12:38

En tant que bottonline: utilisez file.write lors de l'écriture dans des fichiers.

L'idiome ">>" pour l'impression a été emprunté à C ++ dans les premiers jours de Python, et est plutôt impythonique - à tel point qu'il n'existe plus dans Python 3.x - où l'on peut utiliser l'impression, maintenant une fonction au lieu d'une instruction, d'écrire dans un fichier - mais sans syntaxe spéciale pour cela.

Comme @agf le souligne dans sa réponse, utiliser "print" pour écrire dans un fichier fait plus que simplement appeler write - il appelle automatiquement str (obj) pour obtenir une représentation sous forme de chaîne de l'objet, tandis que .write requiert qu'un (octet) la chaîne doit être passée en paramètre - dans le monde Python "explicite vaut mieux qu'implicite", donc un motif de plus pour que l'on choisisse file.write à la place.

1
jsbueno 22 déc. 2011 à 01:47

La documentation sur print peut aider à expliquer ceci: instruction print (Python 2.7 documentation).

print, par défaut, imprime sur la sortie standard, qui est en fait un objet "de type fichier" (sys.stdout). La sortie standard elle-même a une méthode write(). L'utilisation de print >> f semble être une abstraction inutile.

De plus, cela me semble trop verbeux. f.write() va bien.

1
voithos 22 déc. 2011 à 00:58