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).
7 réponses
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
.
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.
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.
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.
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.).
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.
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.
Questions connexes
Questions liées
De nouvelles questions
python
Python est un langage de programmation multi-paradigme, typé dynamiquement et polyvalent. Il est conçu pour être rapide à apprendre, comprendre, utiliser et appliquer une syntaxe propre et uniforme. Veuillez noter que Python 2 est officiellement hors support à partir du 01-01-2020. Néanmoins, pour les questions Python spécifiques à la version, ajoutez la balise [python-2.7] ou [python-3.x]. Lorsque vous utilisez une variante Python (par exemple, Jython, PyPy) ou une bibliothèque (par exemple, Pandas et NumPy), veuillez l'inclure dans les balises.