Façon correcte d'écrire la ligne de fichier?
J'ai l'habitude de faire print >>f, "hi there"
Cependant, il semble que print >>
devient obsolète. Quelle est la méthode recommandée pour la ligne ci-dessus?
mise à Jour:
Concernant toutes ces réponses avec "\n"
...est-ce universel ou Unix-spécifique? C'est à dire, je dois faire "\r\n"
sur Windows?
- "\n" est pas Unix spécifiques. Lorsque le fichier est ouvert en mode texte (par défaut), il est traduit automatiquement à la bonne fin de ligne pour la plate-forme actuelle. L'écriture "\r\n" produirait "\r\r\n", ce qui est faux.
- Ajoutez juste l'impression ord(os.linesep) pour voir le code ascii (10 sur la plupart des systèmes UNIX)
- Pourquoi pensez-vous que c'est déconseillé?
Vous devez vous connecter pour publier un commentaire.
Cela devrait être aussi simple que:
À Partir De La Documentation:
Certains utile de lecture:
avec
déclarationopen()
os
(en particulieros.linesep
)with
est un moyen plus sûr de se rappeler de fermer un fichier.the_file.close()
?os.linesep
de la documentation pour les lecteurs intéressés. Le downvote, comme je le rappel, est venu 2 ans plus tard.python -c 'with open("file.txt", "w") as file: file.write("Hello\n")'
.open
avec"w"
, vous avez encore besoin deos.linesep
avec"wb"
Vous devez utiliser le
print()
fonction qui est disponible depuis la version 2.6 de Python+Pour Python 3, vous n'avez pas besoin de la
import
, depuis leprint()
fonction est la valeur par défaut.L'alternative consisterait à utiliser:
Citant La documentation Python concernant les retours à la ligne:
\n
" exigera newline="" dans le cas contraire, vous obtiendrez\r\r\n
sur Windows. Il n'y a pas de raison de futz avec os.linesep à tous.\n
. Encore -1\r\n
qui contient\n
qui est traduit à l'os.linesep qui est\r\n
de sorte que le résultat final est\r\r\n
.open('myfile','a')
au lieuopen('myfile','w')
?with
déclaration est une mauvaise pratique.open
?open
et de lire de quoi il en retourne. Prend une dizaine de secondes.La python docs recommandons cette manière:
Donc, c'est la façon dont j'ai l'habitude de le faire 🙂
Déclaration de docs.python.org:
with
l'intérieur d'une boucle. Qui me fait constamment ouvrir et de fermer le fichier que j'ai passer dans ma boucle. Peut-être que je manque quelque chose ici, ou c'est vraiment un inconvénient dans ce scénario particulier?Concernant les os.linesep:
Ici est exacte inédite Python 2.7.1 interprète session sur Windows:
Sur Windows:
Comme prévu, le système d'exploitation.linesep ne PAS produire le même résultat que
'\n'
. Il n'y a aucun moyen qu'il pourrait produire le même résultat.'hi there' + os.linesep
est équivalent à'hi there\r\n'
, qui est PAS équivalent à'hi there\n'
.C'est simple: utilisez
\n
qui sera traduit automatiquement à l'os.linesep. Et c'est simple depuis le premier port de Python pour Windows.Il n'y a pas de point à l'aide de mac os.linesep sur les systèmes non-Windows, et il donne de mauvais résultats sur Windows.
NE PAS UTILISER de système d'exploitation.linesep!
os.linesep
dans Windows en mode texte, le résultat est\r\r\n
qui est faux. "Windows utilise ..." est dénuée de sens. La bibliothèque d'exécution C (et donc de Python) traduire\n
à\r\n
sur la sortie en mode texte. D'autres logiciels peuvent se comporter différemment. Il n'est PAS le cas que tous les logiciels en cours d'exécution sur Windows reconnaît un seul\n
comme un séparateur de ligne lors de la lecture en mode texte. Python n'. Microsoft est le bloc-notes de l'éditeur de texte ne fonctionne pas.\r
...os.linesep
est "mauvais" ici. Comme sonDepartment of Redundancy Department
. Oui, vous pouvez le faire. Non, vous ne voulez pas.f.write('hi there\n')
pour unix etf.write('hi there\r\n')
pour DOS. Je vous suggère de construire une ligne de sortie commeoutline = "Hi There!" + "\r\n"
alors simplementf.write(outline)
Je ne pense pas qu'il y est une "bonne" façon.
Je voudrais utiliser:
In memoriam Tim Toady.
with
est hors de portée.open(..., 'a')
ou même'at'
.Zen of Python is, "There should be one — and preferably only one — obvious way to do it."
. C'est ce qui explique une grande partie de ma déception avec la langue. Je l'ai utilisé beaucoup pour cinq ans et plus, mais pour ses bibliothèques et souvent en dépit de la syntaxe. Pas de commentaires en ligne? Le mystificateur structure de classe? Ligne uniquement lambdas?zen of perl
serait un peu un oxymore.En Python 3, c'est une fonction, mais en Python 2, vous pouvez ajouter ce à le haut du fichier source:
Alors vous ne
Si vous écrivez beaucoup de données et de la vitesse est une préoccupation, vous devriez probablement aller avec
f.write(...)
. J'ai fait une rapide comparaison de la vitesse et il a été beaucoup plus rapide queprint(..., file=f)
lors de l'exécution d'un grand nombre d'écritures.En moyenne
write
fini dans 2.45 s sur ma machine, alors queprint
a pris environ 4 fois plus longue (9.76 s). Cela étant dit, dans la plupart des scénarios du monde réel, ce ne sera pas un problème.Si vous choisissez d'aller avec
print(..., file=f)
vous trouverez probablement que vous aurez envie de supprimer le saut de ligne de temps à autre, ou de la remplacer par autre chose. Cela peut être fait en réglant le paramètre facultatifend
paramètre, par exemple;N'importe quelle manière que vous choisissez, je vous suggère de l'aide
with
car il rend le code plus facile à lire.Mise à jour: Cette différence de performance s'explique par le fait que
write
est fortement tamponné et renvoie avant tout écrit sur le disque fait lieu (voir cette réponse), alors queprint
(probablement) utilise la ligne de mise en mémoire tampon. Un test simple pour ce serait à vérifier la performance à long écrit, où les inconvénients (en termes de vitesse) pour la ligne de mise en mémoire tampon serait moins prononcée.La différence de performance devient maintenant beaucoup moins prononcée, avec une durée moyenne de 2,20 s pour
write
et 3.10 s pourprint
. Si vous avez besoin de concaténer un tas de cordes pour obtenir ce loooong ligne performance en souffrira, donc utilisez-les cas oùprint
serait plus efficace sont un peu rares.Depuis 3.5, vous pouvez également utiliser le pathlib à cet effet:
Quand vous avez dit Ligne cela signifie quelque sérialisé personnages qui sont terminés à '\n' personnages. La ligne devrait être passé à un certain point, nous devons considérer les '\n' à la fin de chaque ligne. Voici la solution:
en mode ajout après chaque écriture déplacer le curseur à la ligne, si vous souhaitez utiliser le " w "mode que vous devez ajouter" \n " caractères à la fin d'un write() fonction:
On peut également utiliser le
io
module comme dans:Vous pouvez également essayer
filewriter
pip install filewriter
Écrit dans
my_file.txt
Prend un objet iterable ou un objet avec
__str__
de soutien.Quand j'ai besoin d'écrire de nouvelles lignes beaucoup, je définir un lambda qui utilise un
print
fonction:Cette approche a l'avantage qu'il peut utiliser toutes les fonctionnalités qui sont disponibles avec le
print
fonction.Mise à jour: Comme il est mentionné par Georgy dans la section des commentaires, il est possible d'améliorer davantage cette idée avec la
partial
fonction:À mon humble avis, c'est un plus fonctionnel et moins cryptique approche.
from functools import partial; fwl = partial(print, file=out)
.