Herramientas de usuario

Herramientas del sitio


informatica:programacion:python:cursos:introduccion_programacion_python:ficheros

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Próxima revisión
Revisión previa
informatica:programacion:python:cursos:introduccion_programacion_python:ficheros [2023/04/19 16:54] – creado tempwininformatica:programacion:python:cursos:introduccion_programacion_python:ficheros [2023/04/24 09:39] (actual) – [Manipulación de ficheros con with] tempwin
Línea 2: Línea 2:
  
 <WRAP center round info 60%> <WRAP center round info 60%>
-Notas de la formación por parte de la Consellería de Promoción do Emprego e Igualdade y el [[https://formacion.clusterticgalicia.com|Clúster TIC Galicia]] impartida en 2023.+Bloque perteneciente al curso [[informatica:programacion:python:cursos:introduccion_programacion_python|Introducción a la programación con Python]].
 </WRAP> </WRAP>
 +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) =====
 +
 +<code python>
 +# 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()
 +</code>
 +
 +Si queremos añadir contenido a un fichero existente, en lugar de sustituir todo su contenido, lo abriremos con el modo "append" (''a''):
 +
 +<code python>
 +# 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()
 +</code>
 +
 +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) ===== 
 +
 +<code python>
 +# 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()
 +</code>
 +
 +Podemos indicar la ruta del fichero en ''open'':
 +
 +<code python>
 +# 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()
 +</code>
 +
 +Podemos limitar los datos a leer como argumento del método ''read'':
 +
 +<code python>
 +# 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()
 +</code>
 +
 +Si nos interesa leer línea a línea:
 +
 +<code python>
 +# 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()
 +</code>
 +
 +Otra forma de leer línea a línea un archivo de texto, aprovechando que ''open'' devuelve un objetivo iterable:
 +
 +<code python>
 +# 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()
 +</code>
 +
 +Alternativa:
 +
 +<code python>
 +# 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()
 +</code>
 +
 +===== Ejemplo de uso =====
 +
 +Lectura de un fichero con datos numéricos y hacer operaciones con todo ello.
 +
 +Partiendo de un fichero ''numeros.txt'':
 +
 +<code>
 +2
 +4
 +1
 +66
 +1
 +3
 +5
 +9
 +10
 +</code>
 +
 +Codificamos un programa que sume todos los números que contiene el fichero anterior:
 +
 +<code python>
 +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}")
 +</code>
 +
 +===== 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.
 +
 +<code python>
 +with open("mensaje.txt", "r", encoding="utf8") as f:
 +    for linea in f:
 +        print(f"Datos leídos: {linea}")
 +</code>
 +
 +<WRAP center round info 60%>
 +El uso de de ''with'' para la lectura de ficheros es cómodo porque no necesitamos cerrar el fichero explícitamente
 +</WRAP>
 +
 +===== Ejemplos prácticos =====
 +
 +==== Tratamiento ficheros CSV ====
 +
 +<code python>
 +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(
 +</code>
 +
 +==== Escritura CSV ====
informatica/programacion/python/cursos/introduccion_programacion_python/ficheros.1681916070.txt.gz · Última modificación: por tempwin