web-dev-qa-db-fra.com

Écrire une liste dans un fichier avec Python

Est-ce le moyen le plus simple d’écrire une liste dans un fichier, puisque writelines() n’insère pas de caractères de nouvelle ligne?

file.writelines(["%s\n" % item  for item in list])

Il semble qu'il y aurait un moyen standard ...

470
Josh Arenberg

Vous pouvez utiliser une boucle:

with open('your_file.txt', 'w') as f:
    for item in my_list:
        f.write("%s\n" % item)

En Python 2, vous pouvez également utiliser

with open('your_file.txt', 'w') as f:
    for item in my_list:
        print >> thefile, item

Si vous êtes intéressé par un seul appel à une fonction, supprimez au moins les crochets [], afin que les chaînes à imprimer soient créées une à la fois (un genexp plutôt qu'un listcomp) - aucune raison de prendre toute la mémoire nécessaire pour matérialiser la liste complète des chaînes.

654
Alex Martelli

Qu'allez-vous faire avec le fichier? Ce fichier existe-t-il pour les humains ou pour d’autres programmes avec des exigences d’interopérabilité claires, ou essayez-vous simplement de sérialiser une liste sur un disque pour une utilisation ultérieure par la même application python Si c'est le deuxième cas, vous devriez être pickleing la liste.

import pickle

with open('outfile', 'wb') as fp:
    pickle.dump(itemlist, fp)

Pour le relire:

with open ('outfile', 'rb') as fp:
    itemlist = pickle.load(fp)

Le meilleur moyen est:

outfile.write("\n".join(itemlist))
217
osantana

Encore une autre façon. Sérialiser sur json avec simplejson (inclus en tant que json in python 2.6):

>>> import simplejson
>>> f = open('output.txt', 'w')
>>> simplejson.dump([1,2,3,4], f)
>>> f.close()

Si vous examinez output.txt:

[1, 2, 3, 4]

Ceci est utile car la syntaxe est Pythonic, elle est lisible par l'homme et peut être lue par d'autres programmes dans d'autres langues.

81
Jason Baker

Utilisation de la syntaxe Python 3 et Python 2.6+:

with open(filepath, 'w') as file_handler:
    for item in the_list:
        file_handler.write("{}\n".format(item))

Ceci est indépendant de la plateforme. Il termine également la ligne finale par un caractère de nouvelle ligne, qui est une meilleure pratique UNIX .

80
orluke

Je pensais qu'il serait intéressant d'explorer les avantages de l'utilisation d'un genexp, voici donc mon point de vue.

L'exemple de la question utilise des crochets pour créer une liste temporaire et est donc équivalent à:

file.writelines( list( "%s\n" % item for item in list ) )

Qui construit inutilement une liste temporaire de toutes les lignes qui seront écrites, cela peut consommer une quantité importante de mémoire en fonction de la taille de votre liste et de la précision de la sortie de str(item).

Supprimez les crochets (ce qui équivaut à supprimer l'appel list() d'habillage ci-dessus) passera à la place d'un générateur temporaire à file.writelines():

file.writelines( "%s\n" % item for item in list )

Ce générateur créera une représentation de vos objets item à la demande, avec terminaison par une nouvelle ligne (à mesure qu’ils sont écrits). C'est bien pour deux raisons:

  • Les frais de mémoire sont faibles, même pour les très grandes listes
  • Si str(item) est lent, la progression du fichier est visible au fur et à mesure que chaque élément est traité.

Cela évite les problèmes de mémoire, tels que:

In [1]: import os

In [2]: f = file(os.devnull, "w")

In [3]: %timeit f.writelines( "%s\n" % item for item in xrange(2**20) )
1 loops, best of 3: 385 ms per loop

In [4]: %timeit f.writelines( ["%s\n" % item for item in xrange(2**20)] )
ERROR: Internal Python error in the inspect module.
Below is the traceback from this internal error.

Traceback (most recent call last):
...
MemoryError

(J'ai provoqué cette erreur en limitant la mémoire virtuelle maximale de Python à environ 100 Mo avec ulimit -v 102400).

Mettant de côté l'utilisation de la mémoire, cette méthode n'est pas plus rapide que l'original:

In [4]: %timeit f.writelines( "%s\n" % item for item in xrange(2**20) )
1 loops, best of 3: 370 ms per loop

In [5]: %timeit f.writelines( ["%s\n" % item for item in xrange(2**20)] )
1 loops, best of 3: 360 ms per loop

(Python 2.6.2 sur Linux)

34
RobM

Sérialiser la liste dans un fichier texte avec une valeur séparée par des virgules

mylist = dir()
with open('filename.txt','w') as f:
    f.write( ','.join( mylist ) )
17
themadmax

Parce que je suis paresseux ....

import json
a = [1,2,3]
with open('test.txt', 'w') as f:
    f.write(json.dumps(a))

#Now read the file back into a Python list object
with open('test.txt', 'r') as f:
    a = json.loads(f.read())
14
CommandoScorch

En général

Voici la syntaxe de la méthode writeelines ()

fileObject.writelines( sequence )

Exemple

#!/usr/bin/python

# Open a file
fo = open("foo.txt", "rw+")
seq = ["This is 6th line\n", "This is 7th line"]

# Write sequence of lines at the end of the file.
line = fo.writelines( seq )

# Close opend file
fo.close()

Référence

http://www.tutorialspoint.com/python/file_writelines.htm

13
Marvin W
file.write('\n'.join(list))
11
mtasic85
with open ("test.txt","w")as fp:
   for line in list12:
       fp.write(line+"\n")
7
shankar

Vous pouvez également utiliser la fonction print si vous utilisez python3 comme suit.

f = open("myfile.txt","wb")
print(mylist, file=f)
5
Nandita Damaraju

Pourquoi n'essaies-tu pas

file.write(str(list))
2
Bob

Cette logique convertira d’abord les éléments de la liste en string(str). Parfois, la liste contient un tuple comme 

alist = [(i12,tiger), 
(113,lion)]

Cette logique écrit pour classer chaque tuple dans une nouvelle ligne. Nous pouvons utiliser ultérieurement eval lors du chargement de chaque tuple lors de la lecture du fichier: 

outfile = open('outfile.txt', 'w') # open a file in write mode
for item in list_to_persistence:    # iterate over the list items
   outfile.write(str(item) + '\n') # write to the file
outfile.close()   # close the file 
1
Tahir Ahmad

Une autre façon d’itérer et d’ajouter une nouvelle ligne: 

for item in items:
    filewriter.write(f"{item}" + "\n")
0
Alex