J'ai l'habitude de faire print >>f, "hi there"
Cependant, il semble que cela print >>
devient obsolète. Quelle est la façon recommandée de faire la ligne ci-dessus?
Mise à jour : Concernant toutes ces réponses avec "\n"
... est-ce universel ou spécifique à Unix? IE, dois-je faire "\r\n"
sur Windows?
Réponses:
Cela devrait être aussi simple que:
De la documentation:
Quelques lectures utiles:
with
déclarationopen()
os
(en particulieros.linesep
)la source
with
est un moyen plus sûr de se souvenir de fermer un fichier.the_file.close()
?Vous devez utiliser la
print()
fonction disponible depuis Python 2.6+Pour Python 3, vous n'avez pas besoin de
import
, car laprint()
fonction est la valeur par défaut.L'alternative serait d'utiliser:
Citant de la documentation Python concernant les nouvelles lignes:
la source
\n
" nécessiterait newline = "" sinon vous obtiendriez\r\r\n
sur Windows. Il n'y a aucune raison de vouloir utiliser os.linesep du tout.\r\n
qui contient\n
ce qui est traduit en os.linesep, ce qui fait\r\n
que le résultat final est\r\r\n
.open('myfile','a')
placeopen('myfile','w')
?Les documents python recommandent cette façon:
C'est comme ça que je le fais d'habitude :)
Déclaration de docs.python.org :
la source
with
intérieur d'une boucle. Cela me fait constamment ouvrir et fermer le fichier au fur et à mesure de ma boucle. Peut-être que je manque quelque chose ici, ou c'est vraiment un inconvénient dans ce scénario particulier?Concernant os.linesep:
Voici une session d'interprète Python 2.7.1 exacte non modifiée sur Windows:
Sous Windows:
Comme prévu, os.linesep ne produit PAS le même résultat que
'\n'
. Il n'y a aucun moyen que cela puisse produire le même résultat.'hi there' + os.linesep
est équivalent à'hi there\r\n'
, ce qui n'est PAS équivalent à'hi there\n'
.C'est aussi simple que cela: utilisation
\n
qui sera traduite automatiquement en os.linesep. Et c'est aussi simple que cela depuis le premier portage de Python vers Windows.Il est inutile d'utiliser os.linesep sur des systèmes non Windows et cela produit des résultats incorrects sous Windows.
N'UTILISEZ PAS os.linesep!
la source
os.linesep
dans Windows en mode texte, le résultat\r\r\n
est incorrect. "Windows utilise ..." n'a pas de sens. La bibliothèque d'exécution C (et donc Python) se traduit\n
à\r\n
la sortie en mode texte. D'autres logiciels peuvent se comporter différemment. Ce n'est PAS le cas que tous les logiciels fonctionnant sous Windows reconnaissent un seul\n
comme séparateur de ligne lors de la lecture en mode texte. Python le fait. L'éditeur de texte du Bloc-notes de Microsoft ne fonctionne pas.\r
...os.linesep
est «faux» ici. C'est commeDepartment of Redundancy Department
. Oui, vous pouvez le faire. Non, tu ne veux pas.Je ne pense pas qu'il existe une méthode "correcte".
J'utiliserais:
In memoriam Tim Toady .
la source
with
hors de portée.open(..., 'a')
ou même'at'
.En Python 3, c'est une fonction, mais en Python 2, vous pouvez l'ajouter en haut du fichier source:
Alors tu fais
la source
Si vous écrivez beaucoup de données et que la vitesse est un problème, vous devriez probablement y aller
f.write(...)
. J'ai fait une comparaison de vitesse rapide et c'était beaucoup plus rapide queprint(..., file=f)
lors de l'exécution d'un grand nombre d'écritures.En moyenne,
write
j'ai terminé en 2,45 secondes sur ma machine, alors qu'il aprint
fallu environ 4 fois plus de temps (9,76 secondes). Cela étant dit, dans la plupart des scénarios du monde réel, ce ne sera pas un problème.Si vous choisissez d'y aller,
print(..., file=f)
vous constaterez probablement que vous voudrez supprimer la nouvelle ligne de temps en temps, ou la remplacer par autre chose. Cela peut être fait en définissant leend
paramètre facultatif , par exemple;Quelle que soit la manière que vous choisissez, je suggère d'utiliser
with
car cela rend le code beaucoup plus facile à lire.Mise à jour : Cette différence de performances s'explique par le fait qu'elle
write
est hautement tamponnée et retourne avant que les écritures sur le disque n'aient réellement lieu (voir cette réponse ), alors queprint
(probablement) utilise la mise en mémoire tampon des lignes. Un test simple pour cela serait de vérifier les performances pour les écritures longues également, où les inconvénients (en termes de vitesse) pour la mise en mémoire tampon de ligne seraient moins prononcés.La différence de performances devient maintenant beaucoup moins prononcée, avec un temps moyen de 2,20 s pour
write
et 3,10 s pourprint
. Si vous avez besoin de concaténer un tas de chaînes pour obtenir cette longue ligne, les performances en souffriront, donc les cas d'utilisationprint
qui seraient plus efficaces sont un peu rares.la source
Depuis la version 3.5, vous pouvez également utiliser le
pathlib
pour cela:la source
Lorsque vous avez dit Line, cela signifie certains caractères sérialisés qui se terminent par des caractères «\ n». La ligne doit être la dernière à un moment donné, nous devons donc considérer «\ n» à la fin de chaque ligne. Voici la solution:
en mode ajout après chaque écriture, le curseur se déplace vers une nouvelle ligne, si vous souhaitez utiliser le
w
mode, vous devez ajouter des\n
caractères à la fin de lawrite()
fonction:la source
On peut également utiliser le
io
module comme dans:la source
Pour écrire du texte dans un fichier dans le flacon peut être utilisé:
la source
Vous pouvez aussi essayer
filewriter
pip install filewriter
Écrit dans
my_file.txt
Prend un itérable ou un objet avec
__str__
support.la source
Quand j'ai beaucoup besoin d'écrire de nouvelles lignes, je définis une lambda qui utilise une
print
fonction:Cette approche présente l'avantage de pouvoir utiliser toutes les fonctionnalités disponibles avec la
print
fonction.Mise à jour: Comme mentionné par Georgy dans la section des commentaires, il est possible d'améliorer encore cette idée avec la
partial
fonction:À mon humble avis, il s'agit d'une approche plus fonctionnelle et moins cryptique.
la source
from functools import partial; fwl = partial(print, file=out)
.