====== Ficheros en Python ======
Bloque perteneciente al curso [[informatica:programacion:python:cursos:introduccion_programacion_python|Introducción a la programación con Python]].
Para manipular ficheros, siempre actuaremos de la misma forma:
- Apertura del fichero
- Operaciones de lectura o escritura
- Cierre del fichero
===== Grabar datos en ficheros (escritura) =====
# Apertura del fichero en modo escritura ("w") y codificación UTF-8
# Si el fichero no existe, se crea
f = open("mensaje.txt", "w", encoding="utf8")
# Operaciones de escritura
f.write("Un mensaje.\n")
f.write("Otro mensaje.")
# Cierre del fichero
f.close()
Si queremos añadir contenido a un fichero existente, en lugar de sustituir todo su contenido, lo abriremos con el modo "append" (''a''):
# Apertura del fichero en modo "append" ("a") y codificación UTF-8
# Si el fichero no existe, se crea
f = open("mensaje.txt", "a", encoding="utf8")
# Operaciones de escritura
f.write("Un mensaje más.")
# Cierre del fichero
f.close()
Si el fichero no existiese o estuviera vacío, //append// lo crearía y añadiría el texto que indicásemos.
===== Cargar datos de ficheros (lectura) =====
# Apertura del fichero en modo lectura ("r"),
# especificando codificación UTF-8
f = open("mensaje.txt", "r", encoding="utf8")
# Operaciones de lectura
datos = f.read()
print(datos)
# Cierre del fichero
f.close()
Podemos indicar la ruta del fichero en ''open'':
# Apertura del fichero en modo lectura ("r"),
# especificando codificación UTF-8
f = open("/home/tempwin/mensaje.txt", "r", encoding="utf8")
# Operaciones de lectura
datos = f.read()
print(datos)
# Cierre del fichero
f.close()
Podemos limitar los datos a leer como argumento del método ''read'':
# Apertura del fichero en modo lectura ("r"),
# especificando codificación UTF-8
f = open("mensaje.txt", "r", encoding="utf8")
# Operaciones de lectura, limitando los datos a leer
# (número de bytes a leer)
datos = f.read(10)
print(f"Primer bloque: '{datos}'")
print(f"Segundo bloque: '{datos}'")
# Cierre del fichero
f.close()
Si nos interesa leer línea a línea:
# Apertura del fichero en modo lectura ("r"),
# especificando codificación UTF-8
f = open("mensaje.txt", "r", encoding="utf8")
# Operaciones de lectura, línea completa (válida para archivos de texto)
# (número de bytes a leer)
datos = f.readline()
print(f"Datos leídos: '{datos}'")
# Cierre del fichero
f.close()
Otra forma de leer línea a línea un archivo de texto, aprovechando que ''open'' devuelve un objetivo iterable:
# Apertura del fichero en modo lectura ("r"),
# especificando codificación UTF-8
f = open("mensaje.txt", "r", encoding="utf8")
for linea in f:
print(f"Datos leídos: {linea}")
f.close()
Alternativa:
# Apertura del fichero en modo lectura ("r"),
# especificando codificación UTF-8
f = open("mensaje.txt", "r", encoding="utf8")
while True:
linea = f.readline()
if not linea:
break
print(f"Datos leídos: {linea}")
f.close()
===== Ejemplo de uso =====
Lectura de un fichero con datos numéricos y hacer operaciones con todo ello.
Partiendo de un fichero ''numeros.txt'':
2
4
1
66
1
3
5
9
10
Codificamos un programa que sume todos los números que contiene el fichero anterior:
f = open("numeros.txt", "r", encoding="utf8")
suma = 0
for linea in f:
# Cada línea contiene un texto con un número, que tendremos
# que convertir a un valor numérico
valor = int(linea)
print(valor)
suma += valor
f.close()
print(f"Total: {suma}")
===== Manipulación de ficheros con with =====
El bloque ''with'' establece un contexto en el que el fichero se abre y se asigna a una variable. Durante la ejecución de las instrucciones que están dentro del ''with'' esa variable existe y el recurso (fichero) en cuestión permanece abierto. Al terminar el bloque ''with'', el fichero se cerrará automáticamente como consecuencia de la liberación de la variable asignada.
with open("mensaje.txt", "r", encoding="utf8") as f:
for linea in f:
print(f"Datos leídos: {linea}")
El uso de de ''with'' para la lectura de ficheros es cómodo porque no necesitamos cerrar el fichero explícitamente
===== Ejemplos prácticos =====
==== Tratamiento ficheros CSV ====
import csv
# Lista vacía en la que se irán añadiendo todas las filas
organizaciones = []
with open("organizations-100.csv", newline="") as csvfile:
reader1 = csv.reader(csvfile, delimiter=",", quotechar='"')
for row in reader1:
organizaciones.append(row)
# Mostramos solo las 5 primeras
print(
==== Escritura CSV ====