web-dev-qa-db-fra.com

Écrire et lire une liste à partir d'un fichier

C'est une demande un peu bizarre mais je cherche un moyen d'écrire une liste dans un fichier puis de la relire à un autre moment.

Je n'ai aucun moyen de refaire les listes pour qu'elles soient correctement formées/formatées comme le montre l'exemple ci-dessous.

Mes listes ont des données comme celles-ci:

test
data
here
this
is one
group :)

test
data
here
this
is another
group :)
36
Ryflex

Si vous n'avez pas besoin qu'il soit lisible/modifiable, la solution la plus simple consiste à utiliser simplement pickle.

Écrire:

with open(the_filename, 'wb') as f:
    pickle.dump(my_list, f)

Lire:

with open(the_filename, 'rb') as f:
    my_list = pickle.load(f)

Si vous avez besoin de lisible par l'homme, nous avons besoin de plus d'informations.

Si my_list est une liste de chaînes sans nouvelles lignes, écrivez-les une par ligne:

with open(the_filename, 'w') as f:
    for s in my_list:
        f.write(s + '\n')

with open(the_filename, 'r') as f:
    my_list = [line.rstrip('\n') for line in f]

Si ce sont des chaînes Unicode plutôt que des chaînes d'octets, vous voudrez les encode. (Ou pire, si ce sont des chaînes d'octets, mais pas nécessairement dans le même encodage que celui par défaut de votre système.)

S'ils peuvent avoir des sauts de ligne, des caractères non imprimables, etc., vous pouvez utiliser l'échappement ou la citation. Python possède différents types d’échappement intégrés dans la bibliothèque stdlib.

Utilisons unicode-escape ici pour résoudre les deux problèmes ci-dessus à la fois:

with open(the_filename, 'w') as f:
    for s in my_list:
        f.write((s + u'\n').encode('unicode-escape'))

with open(the_filename, 'r') as f:
    my_list = [line.decode('unicode-escape').rstrip(u'\n') for line in f]

Vous pouvez également utiliser la solution de style 3.x dans 2.x, avec le module codecs ou le module io : *

import io

with io.open(the_filename, 'w', encoding='unicode-escape') as f:
    f.writelines(line + u'\n' for line in my_list)

with open(the_filename, 'r') as f:
    my_list = [line.rstrip(u'\n') for line in f]

* TOOWTDI, alors quel est le moyen le plus évident? Cela dépend… Pour la version courte: si vous devez travailler avec Python antérieures à la version 2.6, utilisez codecs; sinon, utilisez io.

100
abarnert

Tant que votre fichier a un formatage cohérent (c'est-à-dire des sauts de ligne), cette opération est simple avec juste le fichier de base IO et les opérations sur les chaînes:

with open('my_file.txt', 'rU') as in_file:
    data = in_file.read().split('\n')

Cela stockera votre fichier de données sous forme de liste d'éléments, un par ligne. Pour le mettre ensuite dans un fichier, vous feriez l'inverse:

with open('new_file.txt', 'w') as out_file:
    out_file.write('\n'.join(data)) # This will create a string with all of the items in data separated by new-line characters

J'espère que cela correspond à ce que vous recherchez.

13
Derek Peterson

Définissons d'abord une liste:

lst=[1,2,3]

Vous pouvez directement écrire votre liste dans un fichier:

f=open("filename.txt","w")
f.write(str(lst))
f.close()

Pour lire votre liste à partir d'un fichier texte, vous devez d'abord lire le fichier et le stocker dans une variable:

f=open("filename.txt","r")
lst=f.read()
f.close()

Le type de variable lst est bien sûr chaîne. Vous pouvez convertir cette chaîne en tableau en utilisant la fonction eval.

lst=eval(lst)
1
Ali Şentürk