7.5 Archivos texto y diccionarios en Python

Para abrir y guardar un archivo se dispone de un ejemplo de una tabla de voluntarios.txt. La actividad es continuación del ejercicio «Playatón, limpieza de Playas«.

Abrir un archivo

Para el manejo de un archivo es necesario ‘abrir’ el proceso con la instrucción open() que requiere un nombre de archivo y el parámetro de lectura 'r' (read).

El archivo de ejemplo voluntarios.txt para la lectura se debe encontrar en el mismo directorio del script de Python. Si se ubica el archivo en otro directorio se añade la ruta al nombre del archivo.

1234,Juan,921,5.4
9874,Ana,138,6.2
2345,Pedro,432,6.2

La lectura de datos para la lista de ejemplo es línea por línea hasta encontrar una línea vacía ('') al final del archivo.

En el ejemplo, se separan los datos con la instrucción split(), se los ingresa en un registro para un diccionario que se adjunta la lista de voluntarios.

Al final es necesario cerrar el archivo mediante archivo.close()

print(' --- Abrir archivo de voluntarios---')
voluntarios=[]   # lista para datos

# prepara el modo lectura(read 'r') de archivo
archivo=open('voluntarios.txt','r')
linea=archivo.readline() #lee primera linea del archivo

while (linea!=''):  #Hasta encontrar final de archivo
    datos=linea.split(',')  # datos separados por comas
    ced=int(datos[0])
    nom=datos[1]
    pla=int(datos[2])
    rec=float(datos[3])

    # crea el registro como diccionario para la lista
    registro={'cedula':ced,
          'nombre': nom,
          'playa':pla,
          'recolectado':rec}
    voluntarios.append(registro)

    # Lee la siguiente linea
    linea=archivo.readline()

archivo.close()         # Cierra el archivo    
n=len(voluntarios)
print(' Se recuperaron '+ str(n) + ' registros')

Guardar un archivo

para almacenar un archivo es necesario ‘abrir’ el proceso con la instrucción open() que requiere un nombre de archivo y el parámetro de lectura 'w' de «write».

Se escriben los datos en una línea de texto. Al usar los registros de una lista, se los concatena separador por comas ',' antes de escribir la línea en el archivo.

Al final es necesario cerrar el archivo mediante archivo.close()

print('---- guardar el archivo de voluntarios ---')

# prepara el modo escritura(write 'w') de archivo
archivo=open('voluntarios.txt','w')

n=len(voluntarios)
fila=0
while not(fila>=n):

    # Crea linea de texto con datos para un registro, 
    # separada por comas
    cadena = voluntarios[fila]['cedula'])+','
    cadena = cadena + voluntarios[fila]['nombre'] +','
    cadena = cadena + str(voluntarios[fila]['playa']) +','
    cadena = cadena +str(voluntarios[fila]['recolectado']
    registro= str(cadena) +'\n'

    # Escribe en el archivo
    archivo.write(registro)
    fila = fila + 1

archivo.close()     # Cierra el archivo    
print('archivo guardado...')

Ejercicio 05

A partir del archivo adjunto: ‘voluntarios2.txt‘ , realizar cada ítem sin cargar todos los registros en memoria, procesar registro por registro.

  1. Calcule cuántos voluntarios se registraron en cada playa
  2. Determine el total de residuos recolectados en cada playa
  3. Muestre el total de playas atendidas y el total recolectado en el evento.
1234,Juan,921,5.4
9874,Ana,138,6.2
2345,Pedro,432,6.2
4464,Carmen,921,7.746045618
1654,Rosa,138,8.801108179
5892,Carlos,432,11.63081858
746,Juan,921,9.026632449
1630,Roberto,138,6.330733618
5374,Barbara,432,8.973105901
7045,Delia,921,2.691247379
4896,Elena,138,5.753989473
2276,karen,432,3.541916166
3862,Byron,921,9.215178996
1228,Daniel,138,11.10185605
5776,Fernando,432,3.743467333
6859,Gerardo,921,11.32735615
4048,Luis,138,8.775777268
7329,Mario,432,3.663067739
6513,Mercedes,921,7.189236877
3574,Patricio,138,8.390980584
9346,Paola,432,7.640959705
9180,Sara,921,9.341800838
5923,Tania,138,10.24375357
1254,Valeria,432,8.184033273
181,Washington,921,11.54233745
9558,Xavier,138,8.369232005
5019,Zoila,432,10.74144661
5036,Carlos,921,7.511491918
385,Juan,138,8.065057021
1256,Roberto,432,4.228084882
245,Barbara,138,5.102971916
234,Delia,432,3.830932219
6564,Elena,921,9.838714135
8767,karen,138,6.038399291
435,Byron,432,2.365789617