44 votes

f.write vs print >> f

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 l'un d'entre eux est-il plus pythique ? J'essaie d'écrire un tas de HTML dans un fichier et j'ai donc besoin d'un tas d'instructions d'écriture/impression dans mon fichier (mais je n'ai pas besoin d'un moteur de création de modèles).

41voto

agf Points 45052

print fait des choses file.write ne le fait pas, ce qui vous permet d'éviter le formatage des chaînes de caractères pour certains éléments 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 le __str__ o __repr__ les méthodes spéciales d'un objet pour le convertir en chaîne de caractères.

print 1 # prints something like "1\n"

Vous devriez faire ces choses manuellement si vous utilisez file.write au lieu de print .

21voto

Ben Points 22160

Je suis quelque peu en désaccord avec plusieurs des opinions exprimées ici, à savoir que print >> f est redondant et devrait être évité en faveur de f.write .

print y file.write sont des opérations très différentes. file.write écrit directement une chaîne de caractères dans un fichier. print est plutôt "rendre les valeurs à stdout comme du texte". Naturellement, le résultat du rendu d'une chaîne en tant que texte est juste la chaîne, donc print >> f, my_string y f.write(my_string) sont presque interchangeables (à l'exception de l'ajout d'une nouvelle ligne). Mais votre choix entre file.write y print devrait normalement être basée sur ce que vous faites ; écrivez-vous une chaîne de caractères dans un fichier, ou rendez-vous des valeurs dans un fichier ?

Bien sûr, print n'est pas strictement nécessaire en ce sens que 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 de l'option os pour traiter les descripteurs de fichiers. En réalité, il s'agit d'opérations à différents niveaux, et vous devriez utiliser celui qui est le plus approprié à votre utilisation (normalement le niveau sur lequel travaille le code voisin, ou le niveau le plus élevé qui ne vous gêne pas).

J'ai l'impression que le print >> f est assez horrible, et constitue un très bon exemple de la raison pour laquelle les print aurait dû être une fonction depuis le début. Ce point est nettement amélioré dans Python 3. Mais même si vous écrivez du code Python 2 que vous prévoyez de porter vers Python 3, il est toujours possible d'utiliser des fonctions. beaucoup plus facile à convertir print >> f, thing1, thing2, thing3, ... a print(thing1, thing2, thing3, file=f) qu'il ne l'est pour convertir la circonlocution où vous roulez votre propre code pour faire l'équivalent de print et ensuite appeler 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 évitez l'option print >> f formulaire.

En résumé, utilisez print pour rendre les valeurs à stdout (ou à un fichier). Utilisez f.write pour écrire du texte dans un fichier.

4voto

wannik Points 3026

D'accord avec @agf

Je préférais 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 des print commandement.

write n'accepte que les chaînes de caractères.

3voto

Jim Oldfield Points 581

Vous ne devriez faire aucune de ces deux choses. La chose la plus pythique à faire est d'utiliser la fonction print de Python 3 (par opposition à la fonction print de Python 2). déclaration ) :

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

Bien entendu, l'idéal est d'utiliser Python 3. Mais si vous êtes coincé avec Python 2, vous pouvez l'activer à l'aide de la commande déclaration future en haut du fichier :

from __future__ import print_function

Notez que cela modifie l'impression d'autres façons, la plus évidente étant que vous devez ajouter des parenthèses autour de ses arguments. Mais les changements sont tous des améliorations, ce qui est la raison même du changement dans Python 3. Pendant que vous y êtes, pensez à utiliser toutes les déclarations futures pour obtenir autant d'améliorations rétroportées de Python 3 que possible.

2voto

voithos Points 15066

La documentation sur print pourrait aider à expliquer cela : imprimer la déclaration (documentation Python 2.7).

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 un write() méthode. Utilisation de print >> f semble être une abstraction inutile.

En outre, il me semble trop verbeux. f.write() est bien.

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