Leer y escribir listas en un archivo en Python

Como estructuras de datos serializados, los programadores de Python utilizan de forma intensiva matrices, listas y diccionarios. Almacenar estas estructuras de datos de manera persistente requiere un...

Como estructuras de datos serializados, los programadores de Python utilizan de forma intensiva matrices, listas y diccionarios. El almacenamiento persistente de estas estructuras de datos requiere un archivo o una base de datos para trabajar. Este artículo describe cómo escribir una lista en un archivo y cómo volver a leer esa lista en la memoria.

Para escribir datos en un archivo, y para leer datos de un archivo, el lenguaje de programación Python ofrece los métodos estándar write() y read() para trabajar con una sola línea, así como writelines() y readlines() para trabajar con varias líneas. Además, tanto el módulo pickle como el json también permiten formas inteligentes de tratar con conjuntos de datos serializados.

Uso de los métodos de lectura y escritura {#uso de los métodos de lectura y escritura}

Para tratar con caracteres (cadenas), los métodos básicos funcionan excelente. Guardar una lista de este tipo línea por línea en el archivo listfile.txt se puede hacer de la siguiente manera:

1
2
3
4
5
6
# define list of places
places = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']

with open('listfile.txt', 'w') as filehandle:
    for listitem in places:
        filehandle.write('%s\n' % listitem)

En la línea 6, el listitem se extiende con un salto de línea "\n", en primer lugar, y se almacena en el archivo de salida, en segundo lugar. Para volver a leer la lista completa del archivo listfile.txt en la memoria, este código de Python le muestra cómo funciona:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# define an empty list
places = []

# open file and read the content in a list
with open('listfile.txt', 'r') as filehandle:
    for line in filehandle:
        # remove linebreak which is the last character of the string
        currentPlace = line[:-1]

        # add item to the list
        places.append(currentPlace)

Tenga en cuenta que deberá eliminar el salto de línea del final de la cadena. En este caso, nos ayuda que Python también permita operaciones de lista en cadenas. En la línea 8 del código anterior, esta eliminación se realiza simplemente como una operación de lista en la propia cadena, que conserva todo excepto el último elemento. Este elemento contiene el carácter "\n" que representa el salto de línea en los sistemas UNIX/Linux.

Uso de los métodos writelines y readlines

Como se mencionó al principio de este artículo, Python también contiene los dos métodos writelines() y readlines() para escribir y leer varias líneas en un solo paso, respectivamente. Para escribir la lista completa en un archivo en el disco, el código de Python es el siguiente:

1
2
3
4
5
# define list of places
places_list = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']

with open('listfile.txt', 'w') as filehandle:
    filehandle.writelines("%s\n" % place for place in places_list)

Para leer la lista completa desde un archivo en el disco, el código de Python es el siguiente:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# define empty list
places = []

# open file and read the content in a list
with open('listfile.txt', 'r') as filehandle:
    filecontents = filehandle.readlines()

    for line in filecontents:
        # remove linebreak which is the last character of the string
        current_place = line[:-1]

        # add item to the list
        places.append(current_place)

La lista anterior sigue un enfoque más tradicional tomado de otros lenguajes de programación. Para escribirlo de una manera más pythonica, eche un vistazo al código a continuación:

1
2
3
4
5
6
# define empty list
places = []

# open file and read the content in a list
with open('listfile.txt', 'r') as filehandle:
    places = [current_place.rstrip() for current_place in filehandle.readlines()]

Habiendo abierto el archivo listfile.txt en la línea 5, el restablecimiento de la lista se lleva a cabo completamente en la línea 6. En primer lugar, el contenido del archivo se lee a través de readlines(). En segundo lugar, en un bucle for de cada línea, el carácter de salto de línea se elimina utilizando el método rstrip(). En tercer lugar, la cadena se agrega a la lista de lugares como un nuevo elemento de lista. En comparación con la lista anterior, el código es mucho más compacto, pero puede ser más difícil de leer para los programadores principiantes de Python.

Uso del módulo pickle

Los diferentes métodos explicados hasta ahora almacenan la lista de manera que los humanos aún puedan leerla. En caso de que esto no sea necesario, el módulo pepinillo puede resultarle muy útil. Su método dump() almacena la lista de manera eficiente como un flujo de datos binarios. En primer lugar, en la línea 7 (en el código siguiente) se abre el archivo de salida listfile.data para escritura binaria ("wb"). En segundo lugar, en la línea 9
la lista se almacena en el archivo abierto usando el método dump().

1
2
3
4
5
6
7
8
9
# load additional module
import pickle

# define a list of places
placesList = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']

with open('listfile.data', 'wb') as filehandle:
    # store the data as binary data stream
    pickle.dump(placesList, filehandle)

Como siguiente paso, leemos la lista del archivo de la siguiente manera. En primer lugar, el archivo de salida listfile.data se abre en formato binario para lectura ("rb") en la línea 4. En segundo lugar, la lista de lugares se carga desde el archivo mediante el método load().

1
2
3
4
5
6
# load additional module
import pickle

with open('listfile.data', 'rb') as filehandle:
    # read the data as binary data stream
    placesList = pickle.load(filehandle)

Los dos ejemplos aquí demuestran el uso de cadenas. Sin embargo, pickle funciona con todo tipo de objetos de Python, como cadenas, números, estructuras autodefinidas y cualquier otra estructura de datos integrada que proporciona Python.

Uso del formato JSON

El formato de datos binarios que utiliza pickle es específico de Python. Para mejorar la interoperabilidad entre diferentes programas, la notación de objetos de JavaScript (JSON) proporciona un esquema fácil de usar y legible por humanos, y por lo tanto se hizo muy popular.

El siguiente ejemplo demuestra cómo escribir una lista de tipos de variables mixtas en un archivo de salida usando el módulo json. En la línea 4 se define la lista básica. Habiendo abierto el archivo de salida para escribir en la línea 7, el método dump() almacena la lista básica en el archivo usando la notación JSON.

1
2
3
4
5
6
7
8
import json

# define list with values
basicList = [1, "Cape Town", 4.6]

# open output file for writing
with open('listfile.txt', 'w') as filehandle:
    json.dump(basicList, filehandle)

Volver a leer el contenido del archivo de salida en la memoria es tan simple como escribir los datos. El método correspondiente a dump() se llama load() y funciona de la siguiente manera:

1
2
3
4
5
import json

# open output file for reading
with open('listfile.txt', 'r') as filehandle:
    basicList = json.load(filehandle)

Conclusión

Los diferentes métodos que se muestran arriba van desde la simple escritura/lectura de datos hasta el volcado/carga de datos a través de flujos binarios usando pickle y JSON. Esto simplifica el almacenamiento persistente de una lista y su lectura en la memoria.

Agradecimientos

El autor quisiera agradecer a Zoleka Hatitongwe por su apoyo mientras preparaba el artículo.