Question Manière correcte d'écrire une ligne dans un fichier?


J'ai l'habitude de faire print >>f, "hi there"

Cependant, il semble que print >> devient obsolète. Quelle est la manière recommandée de faire la ligne ci-dessus?

Mettre à jour: En ce qui concerne toutes ces réponses avec "\n"... est-ce universel ou spécifique à Unix? IE, devrais-je faire "\r\n" sur Windows?


773
2018-05-28 05:44


origine


Réponses:


Cela devrait être aussi simple que:

with open('somefile.txt', 'a') as the_file:
    the_file.write('Hello\n')

De la documentation:

Ne pas utiliser os.linesep comme terminaison de ligne lors de l'écriture de fichiers ouverts en mode texte (par défaut); utilisez un seul '\ n' à la place, sur toutes les plateformes.

Quelques lectures utiles:


694
2018-05-28 06:36



Vous devriez utiliser le print() fonction qui est disponible depuis Python 2.6+

from __future__ import print_function  # Only needed for Python 2
print("hi there", file=f)

Pour Python 3, vous n'avez pas besoin de import, depuis le print() La fonction est la valeur par défaut.

L'alternative serait d'utiliser:

f = open('myfile', 'w')
f.write('hi there\n')  # python will convert \n to os.linesep
f.close()  # you can omit in most cases as the destructor will call it

Citant de Documentation Python concernant les nouvelles lignes:

En sortie, si newline est None, any '\n' les caractères écrits sont traduits dans le séparateur de ligne par défaut du système, os.linesep. Si newline est '', aucune traduction n'a lieu. Si newline est l'une des autres valeurs légales, '\n' les caractères écrits sont traduits dans la chaîne donnée.


897
2018-05-28 05:48



le Docs python recommande de cette façon:

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

Donc c'est comme ça que je le fais habituellement :)

Déclaration de docs.python.org:

C'est une bonne pratique d'utiliser le 'avec' mot-clé lorsqu'il s'agit de fichier   objets. Cela a l'avantage que le fichier est correctement fermé après   sa suite se termine, même si une exception est levée en cours de route. C'est   aussi beaucoup plus court que d'écrire des blocs try-finally équivalents.


91
2017-10-13 09:37



En ce qui concerne os.linesep:

Voici une session d'interpréteur Python 2.7.1 non éditée exacte sur Windows:

Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.linesep
'\r\n'
>>> f = open('myfile','w')
>>> f.write('hi there\n')
>>> f.write('hi there' + os.linesep) # same result as previous line ?????????
>>> f.close()
>>> open('myfile', 'rb').read()
'hi there\r\nhi there\r\r\n'
>>>

Sur Windows:

Comme prévu, os.linesep NE PAS produire 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', lequel est NE PAS équivalent à 'hi there\n'.

C'est simple: utiliser \n qui sera traduit 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 erronés sous Windows.

N'UTILISEZ PAS os.linesep!


80
2018-05-29 03:02



Je ne pense pas qu'il y ait un "bon" moyen.

J'utiliserais:

with open ('myfile', 'a') as f: f.write ('hi there\n')

En mémoire Tim Toady.


46
2018-05-28 05:48



En Python 3 c'est une fonction, mais dans Python 2 vous pouvez ajouter ceci au début du fichier source:

from __future__ import print_function

Alors vous faites

print("hi there", file=f)

17
2018-05-28 05:49



Si vous écrivez beaucoup de données et la vitesse est une préoccupation, vous devriez probablement aller avec f.write(...). J'ai fait une comparaison de vitesse rapide et c'était beaucoup plus rapide que print(..., file=f) lors de l'exécution d'un grand nombre d'écritures.

import time    

start = start = time.time()
with open("test.txt", 'w') as f:
    for i in range(10000000):
        # print('This is a speed test', file=f)
        # f.write('This is a speed test\n')
end = time.time()
print(end - start)

En moyenne write fini en 2.45s sur ma machine, alors que print pris environ 4 fois plus longtemps (9.76s). Cela dit, dans la plupart des scénarios du monde réel, cela ne posera aucun problème.

Si vous choisissez d'aller avec print(..., file=f) vous trouverez probablement que vous voudrez supprimer le retour à la ligne de temps en temps, ou le remplacer par quelque chose d'autre. Cela peut être fait en définissant l'option end paramètre, par exemple.

with open("test", 'w') as f:
    print('Foo1,', file=f, end='')
    print('Foo2,', file=f, end='')
    print('Foo3', file=f)

Quelle que soit la façon dont vous choisissez, je suggère d'utiliser with car cela rend le code beaucoup plus facile à lire.

Mettre à jour: Cette différence de performance s'explique par le fait que write est fortement tamponné et retourne avant que toutes les écritures sur le disque aient lieu (voir cette réponse), tandis que print (probablement) utilise la mise en mémoire tampon de ligne. Un test simple pour cela consisterait à vérifier les performances pour les écritures longues, où les inconvénients (en termes de vitesse) pour la mise en mémoire tampon des lignes seraient moins prononcés.

start = start = time.time()
long_line = 'This is a speed test' * 100
with open("test.txt", 'w') as f:
    for i in range(1000000):
        # print(long_line, file=f)
        # f.write(long_line + '\n')
end = time.time()

print(end - start, "s")

La différence de performance devient maintenant beaucoup moins prononcée, avec un temps moyen de 2.20s pour write et 3.10s pour print. Si vous avez besoin de concaténer un tas de chaînes pour obtenir cette performance ligne loooong va souffrir, donc des cas d'utilisation où print serait plus efficace sont un peu rares.


14
2017-09-13 16:20



Quand vous avez dit Ligne, cela signifie que certains caractères sérialisés sont terminés par des caractères \ n. La ligne devrait être la dernière à un certain point donc nous devrions considérer '\ n' à la fin de chaque ligne. Voici la solution:

with open('YOURFILE.txt', 'a') as the_file:
    the_file.write('Hello')

en mode ajout après chaque écriture, le curseur se déplace sur une nouvelle ligne, si vous voulez utiliser le mode 'w', vous devez ajouter des caractères '\ n' à la fin de la fonction write ():

the_file.write('Hello'+'\n')

5
2017-08-26 14:44