====== 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 ====