Escribir y leer una lista desde un archivo


Esta es una solicitud un poco rara, pero estoy buscando una manera de escribir una lista para archivarla y luego leerla en otro momento.

No tengo forma de rehacer las listas para que estén correctamente formadas/formateadas como muestra el siguiente ejemplo.

Mis listas tienen datos como los siguientes:

test
data
here
this
is one
group :)

test
data
here
this
is another
group :)
Author: Aran-Fey, 2013-06-21

2 answers

Si no necesita que sea legible/editable por humanos, la solución más fácil es usar pickle.

Para escribir:

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

Debe decir:

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

Si necesita que sean legibles por humanos, necesitamos más información.

Si se garantiza que my_list es una lista de cadenas sin nuevas líneas incrustadas, simplemente escríbalas una por línea:

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 son cadenas Unicode en lugar de cadenas de bytes, querrá encode que sean. (O, peor, si son cadenas de bytes, pero no necesariamente en la misma codificación que el sistema predeterminado.)

Si pueden tener nuevas líneas, o caracteres no imprimibles, etc., puede utilizar el escape o citar. Python tiene una variedad de diferentes tipos de escape integrados en el stdlib.

Usemos unicode-escape aquí para resolver los dos problemas anteriores a la vez:

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]

También puede usar el 3.solución estilo x en 2.x, con cualquiera de los dos codecs módulo o el io módulo:*

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, ¿cuál es la única manera obvia? Depende... Para la versión corta: si necesita trabajar con versiones de Python anteriores a la 2.6, use codecs; si no, use io.

 95
Author: abarnert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-15 17:56:27

Mientras su archivo tenga un formato consistente (es decir, saltos de línea), esto es fácil con solo operaciones básicas de IO de archivo y cadena:

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

Que almacenará su archivo de datos como una lista de elementos, uno por línea. Para luego ponerlo en un archivo, usted haría lo contrario:

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

Esperemos que eso se ajuste a lo que estás buscando.

 13
Author: Derek Peterson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-20 23:20:36