Archivos en Python – Métodos del objeto file y modos de apertura

En esta entrada me gustaría que comenzaremos a aprender archivos en python, vamos a ver como crear y editar archivos en python desde nuestro código de manera segura usando también try /except para que en caso de obtener errores podamos manejarlos como se debe. Venga manos a la obra!

Archivos en Python 3 : Crear; leer; abrir; ejecutar

 

Icono de archivos en python

 

Para crear un archivo en python desde nuestro código encontraras diferentes maneras pero yo recomiendo utilizar la que aquí voy a explicar debido a que es más segura y óptima a la hora de modificar ficheros.

 

Crear archivos en python usando With

Esta cláusula establece automáticamente un contexto para la ejecución segura debido a que crea un punto de partida de configuraciones iniciales y al finalizar recupera los valores anteriores. Y en el caso de la apertura de un archivo este automáticamente ha de cerrarlo una vez terminada la función que lo involucre, así como también se realiza una limpieza de la memoria utilizada.

Por esto creo que la forma correcta de manipular archivos es utilizando la cláusula with aunque veo muchos tutoriales y cursos donde se enseña a abrir y crear ficheros solo utilizando el método open (lo que no está mal pero tampoco es lo mas optimo)

De esta manera se utiliza un gestor de contexto «Context Manager» que son objetos que tienen definido los métodos enter y exit  para inicializar el contexto y para terminarlo al igual que los objetos file, esto nos asegura que se ha de cerrar correctamente.

 

Abrir archivos en python mediante el objeto file

Podemos manipular una variable como un objeto file (archivo) asignándole un archivo mediante la función integrada open e indicando la ruta del mismo seguido del modo en el cual vamos a abrirlo. Entonces la variable toma como valor el archivo y se convierte en un objeto file permitiéndonos trabajar con ella utilizando los métodos.

Entiendes Mendez?

Combinándolo con la cláusula whit as lo hacemos de la siguiente manera:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  sin título.py
#  
#  Copyright 2018 https://pythones.net


#Forma clásica de crear un archivo:

f = open("archivotext.txt", "w") #Creamos el archivo
f.write("Creando archivo de texto en python de forma clásica") #<-Escribimos en el
f.close() #Cerramos el archivo



#Utilizando With As <-----------------------Nuestra forma de hacerlo

with open ("archivotext.txt", "w") as f: #Creamos el archivo
    f.write("Creando archivo de texto en python usando whit as") #<-Escribimos en el
    f.close()
#Podria traducirse como:
#Abrir "archivotext.txt en modo Write como f.

 

Te recomiendo acostumbrarte a hacerlo utilizando la cláusula with as aunque su sintaxis es un poco más difícil de recordar a mi forma de verla es mucho más segura y estable. Venga veamos y repasemos la sintaxis:

 

with open ("Nombre", "modo de apertura") as Objeto:
     Objeto.Write() #<----Método escribir del objeto 

#Recordar que las líneas debajo de with as deben ir identadas!

 

Bueno si ya has comprendido la sintaxis ponla en práctica.. Intenta crear un archivo «.py» que sea capaz de parir un «txt» (nose porque utilizo estos términos supongo que para generar polémica) Y sino míralo en funcionamiento en mis clásicos gifs:

Dando a luz un .txt (imagen gif)

Creando un Archivo en Python


Métodos del objeto file en python

Anteriormente habíamos visto que son los métodos, los que se podría traducir como órdenes que le podemos dar a los objetos. Hace poco había visto un ejemplo en un sitio que decía que un objeto podría ser nuestro perro y un método las órdenes que le dictamos las cuales le hemos enseñado con anterioridad (sentarse, rodar, dar la pata).

Veamos nuevamente la definición que dimos anteriormente sobre los métodos:

Un método puede ser una serie de sentencias para llevar a cabo una acción, pero en este caso podemos ver al método como el pedido a un objeto para que realice una tarea o en este caso un cambio!

Comprender los métodos del objeto file nos van a permitir manipular archivos en python, (crearlos, abrirlos, guardarlos o solo leerlos)

Es importante saber que cuando lo abrimos existe un puntero, que es donde se posiciona el intérprete sobre el archivo, normalmente lo hace al inicio, pero si quisiéramos abrirlo con el puntero en determinada ubicación podríamos hacerlo con los métodos de los que dispone el objeto file:

Método Seek(byte)

Este método se corresponde al puntero que te mencionaba y junto al método tell() nos permitirá ubicarnos al final o al principio de los archivos. Pero el método seek() fue diseñado para archivos binarios, no para archivos de texto.

Este método moverá el puntero hacia el byte indicado como argumento.

seek (desplazamiento, desde_donde)

Si colocamos un cero ‘0’ como argumento a seek nos posiciona al inicio del archivo!

Método Tell()

El método tell() devuelve el puntero a una posición en un momento dado. Junto con seek() nos permitirán posicionarnos al principio o al final.

Tell() nos devuelve un entero que indica la posición del puntero.

 

Método Read([bytes])

El método read nos permite leer un archivo completo, salvo que indiquemos los bytes entonces solo leerá hasta los bytes determinados. Vamos a ver como utilizarlo abriendo un archivo .txt que tengo por aquí guardado perteneciente a la letra de una canción:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  sin título.py
#  
#  Copyright 2018 https://pythones.net
#  
with open ("pirata.txt", "r") as f: #Abrimos de modo Read (r)
    contenido = f.read() #<-Lo abrimos utilizando el metodo read
                            # Y lo almacenamos en la variable
print (contenido)           #Imprimimos la variable que tiene el contenido

Resultado:

Abrir archivos en python método read

 

Presta atención a la letra «r» que colocamos como modo luego del nombre, esto significa que lo abre  solo para ser leído. Por ende no puede ser editado.

Y cuidado con esto porque si colocas una «w» de «Write» lo abrirás en modo escribir en el. Y se borrara todo el contenido. Esto lo veremos más abajo en los Modos de apertura.

 

Método Readline([bytes])

El método readline lee una línea por vez. Si colocamos un solo readline nos leerá una sola línea y si no especificamos a partir de donde sera la primera por defecto. Veamos el código!

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  sin título.py
#  
#  Copyright 2018 https://pythones.net
#

with open ("pirata.txt", "r") as f: #Abrimos el archivo de modo read (r)
    linea1 = f.readline() #<-Almacenamos en variable linea1 el método readline()
    linea2 = f.readline() #<-Volvemos a almacenar en variable linea2 el método readline()
    print (linea1) 
    print (linea2)

Resultado:

Método readline()

Cada vez que hagamos un readline() tomará la siguiente línea.

Imprimir o leer sólo líneas específicas de un archivo en python

Algo adicional para la comprensión avanzada en caso de querer imprimir líneas en específico como por ejemplo el estribillo :

En caso de querer imprimir una linea especifica no podemos hacerlo con readline() correctamente. Aun posicionando el puntero con el método seek() porque el mismo fue creado con la idea de posicionar en archivos binarios, y en cambio los de texto se manejan linea a linea, por lo que sería un bodrio calcular donde específicamente establecer el puntero si no es al principio o al final.

Suponiendo que quisiéramos imprimir a partir de la línea 34 a la 38 inclusive correspondiente al estribillo deberíamos hacerlo iterando el archivo de texto con la función predefinida enumerate e imprimir solo las lineas que nos interesan. Voy a dejar el código pero si estas aprendiendo python aun es obvio que no lo comprendas, pero se me ocurre que le puede ser útil a alguien dado que no se encuentran casi formas de iterar correctamente un archivo de texto linea a linea:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  sin título.py
#  
#  Copyright 2018 https://pythones.net
#
with open ("pirata.txt", "r") as f: #Abrimos como modo read (r)
    estribillo=(linea for i,linea in enumerate(f) if i>=34 and i<=38)
    for linea in estribillo:
        print (linea)

Es la única manera que encontré de realizar lo antes mencionado, a esto se le denomina técnica de iteración utilizando la función enumerate(). Que veremos más adelante para no irnos por las ramas, pero joder que tenia que ponerlo porque me volví loco intentando imprimir una línea específica con readlines() y seek() y nunca lo logre.

Método Readlines()

Lee todas las líneas en forma de lista separando las líneas con el carácter de escape para los saltos de línea «/n»

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  sin título.py
#  
#  Copyright 2018 https://pythones.net

with open ("pirata.txt", "r") as f: #Abrimos usando Read (r)
    contenido = f.readlines() #<-Lo abrimos utilizando el método readlines
                        # Y lo almacenamos en la variable

    print (contenido)           #Imprimimos la variable que tiene el contenido

Resultado:

Método readlines()

Método Write()

Sirve para escribir una cadena dentro del mismo. Para esto debemos abrirlo con modo de re-escribir lo cual se hace agregando «r+» en el modo de apertura. De esta manera nuestra cadena se añadirá al final.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  sin título.py
#  
#  Copyright 2018 https://pythones.net
#

with open ("pirata.txt", "r+") as f: #Abrimos a modo Reescribir (r+)
    contenido = f.read() #<-Lo abrimos utilizando read
                        # Y lo almacenamos en la variable
    final_del_archivo = f.tell() #(OPCIONAL)Definimos variable con el puntero al final
    f.write("Tierra santa - Canción del pirata") # Escribimos la nueva línea
    f.seek(final_del_archivo)#(OPCIONAL)
    contenido_editado = f.read()#(OPCIONAL) Guardamos en la variable la nueva línea utilizando read()
    print (contenido_editado)           #(OPCIONAL)Imprimimos la variable que tiene el contenido nuevo

Resultado:

Método Write()

El código (OPCIONAL) en sí es difícil de comprender a simple vista pero una vez que veas y entiendas todos los métodos te sera mas fácil de entender. Pero en si lo que hace es almacenar mediante el método tell() el puntero al final y lo almacena en una variable entonces luego solo llamamos al método seek() con la variable como argumento para posicionarnos al final luego de agregar la nueva línea, y almacenamos en una variable la línea editada utilizando otro read() y para finalizar imprimimos el nuevo contenido. Pero es opcional solo para que nos quede más chulo.

Tú simplemente puedes hacerlo así:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  sin título.py
#  
#  Copyright 2018 https://pythones.net
#
with open ("pirata.txt", "r+") as f: #Abrimos utilizando Reescribir (r+)
    contenido = f.read()
    f.write("Tierra santa - Canción del pirata") # Escribimos la nueva línea

Si no utilizas el f.read() la línea se añadirá al principio y no al final. También para agregarla al final puedes abrirlo como apertura «a» en vez de «r+» y sin incluir el .read(). Así:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  sin título.py
#  
#  Copyright 2018 https://pythones.net
#
with open ("pirata.txt", "a") as f: #Abrimos el usando el modo (a)
    f.write("Tierra santa - Canción del pirata") # Escribimos la nueva línea

 

Método Writelines(secuencia)

Nos permite escribir una secuencia (elemento iterable) dentro de el linea a linea por ejemplo: Una lista.

 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  sin título.py
#  
#  Copyright 2018 https://pythones.net
#
Lista = ["Cancion \n", "sobre \n", "piratas"]
with open ("pirata.txt", "r+") as f: #Lo abrimos como Reescribir (r+)
    contenido = f.read()  #<-Lo abrimos utilizando read
                          # Y lo almacenamos en la variable
    final_del_archivo = f.tell()   #(OPCIONAL)Definimos variable con el puntero a lo ultimo del archivo
    f.writelines(Lista)   # Escribimos la Lista en el archivo linea a linea
    f.seek(final_del_archivo)    #(OPCIONAL)Nos trasladamos al final
    contenido_editado = f.read()#(OPCIONAL)Guardamos en la variable la nueva línea utilizando read()
    print (contenido_editado)           #(OPCIONAL)Imprimimos la variable que tiene el contenido nuevo

Resultado:

Método Writelines()

Sin incluir el código opcional de mostrar las líneas editadas:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  sin título.py
#  
#  Copyright 2018 https://pythones.net
#
Lista = ["Cancion \n", "sobre \n", "piratas"]
with open ("pirata.txt", "r+") as f: #Abrimos usando Reescribir (r+)
    contenido = f.read()  #<-Lo abrimos utilizando read
    f.writelines(Lista)   # Escribimos la Lista en el archivo linea a linea

 

 

Método Close()

El método close se encarga de cerrar el archivo de forma segura. Si pretendes modificar un archivo luego de utilizar el método close() se producirá un error, debido a que ya se cerró. Deberás abrirlo nuevamente.


 

 

Modos de apertura de archivos en python

El modo de apertura de nuestros archivos es importante debido a que determinan varios factores a tener en cuenta y permiten abrir archivos tanto para solo lectura como para edición, o reemplazo completo. Veamos cuales son y cual es su sintaxis a la hora de especificarlo.

Modo de Solo lectura (Read) («r»)

Para especificar que lo abrimos en modo de lectura lo hacemos añadiendo la letra «r» luego del nombre. Como lo especifica su nombre solo permite al intérprete trabajar con él en modo lectura por lo que lo cargará en memoria pero no podrá editarlo.

Modo de Escritura (Write) («w»)

Al abrir un archivo en este modo el mismo será borrado y vuelto a escribir, por eso es importante distinguir este modo como de truncado. Si el archivo no existe, lo creara. Pero hay que tener en cuenta el echo de que si el mismo existe sera reescrito, y eso si trabajamos con algún archivo importante es destacable.

Modo de Solo escritura al final («a»)

Este modo nos permite escribir en el archivo posicionandonos al final de el mismo. Si abrimos un archivo utilizando este modo siempre estaremos escribiendo a continuación de lo que ya se encuentra en el mismo sin necesidad de posicionar el puntero. También al igual que write si el archivo no existe sera creado.

Modo de Lectura- Escritura (+) (r+ , w+, a+)

Si a cualquiera de los anteriores le añadimos un «+» se convierte en modo de escritura y lectura. Pero ambos («r+») y («w+») trabajan de manera diferente. Al utilizar («w+») si el archivo existe será truncado, es decir, se borrara todo su contenido y se sobreescribirá en el. No es así el caso de («r+»). (a+) permanece igual, solo que al agregarle un + si el fichero no existe sera creado.

Recuerda que tanto «w» como «w+» van a truncar los archivos en caso de existir, por lo que si abres un file existente el mismo será sobrescrito y perderás su contenido.

Sintaxis de los modos de apertura:

 

#Aqui se muestran los modos que puedes utilizar y donde se especifican
#                         "w"
#                         "r"
#                         "a"
#                         "w+"
with open ("pirata.txt", "r+") as f: #Abrimos para Reescribir (r+)
    contenido = f.read()  #<-Lo abrimos utilizando read

 

 


Crear un programa para leer archivos desde Python

 

Paso 1: Utilizamos Try / Except para atrapar excepciones al abrirlo

Creando un programa en python para leer archivos

 

Podemos agregar una sentencia try / except para en caso de generarse una error a la hora de abrir un archivo, por ejemplo en el caso que nos hayamos equivocado de ubicación. Veamos como aplicarlo en este caso de querer abrir un archivo para leerlo:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  sin título.py
#  
#  Copyright 2018 https://pythones.net
#
with open ("pirata.txt", "r+") as f: #Abrimos el como Reescribir (r+)
    contenido = f.read()  #<-Lo abrimos utilizando read

 

En este caso he eliminado el archivo de texto piratas.txt y por ende nos produce este error (obviamente porque lo estamos intentando abrir en modo «r+» porque si lo intentáramos colocando el modo write («w+») el archivo se crearía y no nos daría ningún error):

Error al abrir archivo en la ubicación

Traceback (most recent call last):
File «archivo.py», line 8, in <module>
with open («pirata.txt», «r+») as f: #Abrimos a modo Reescribir (r+)
FileNotFoundError: [Errno 2] No such file or directory: ‘pirata.txt’

 

Como podemos interpretar en el error nos esta diciendo que el archivo no existe. Así que podemos hacer dos cosas, crear un try / except donde se le advierta al usuario, y también podemos pedirle al usuario que ingrese la ubicación donde debería estar el archivo, que en este caso lo coloque dentro de la carpeta test. ¿Que te parece si lo intentamos? ya tenemos los conocimientos necesarios, venga!

 

Paso 2: Le preguntamos al usuario donde se encuentra:

 

Para hacer esto es obvio que deberíamos declarar una variable que almacene la ruta por defecto : /piratas.txt y en caso de error que le solicite al usuario ingresar un nuevo dato en esa variable, podemos hacerlo así:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  sin título.py
#  
#  Copyright 2018 https://pythones.net
#
while True: #Creamos un bucle infinito
    try: #Intentamos abrirlo
        with open ("pirata.txt", "r+") as f: #Abrimos el fichero a modo de Reescribir (r+)
            contenido = f.read()  #<-Lo abrimos utilizando el método read
            print(contenido) #Imprimimos el texto que almacenamos en la variable contenido
            break  #Rompemos el bucle
    except:
        print("Error al intentar abrir")
        break #Rompemos el bucle

 

Bien hasta aquí creamos un bucle infinito utilizando while true y ademas añadimos un try/except en caso de que ocurra un error, que sabemos que va a ocurrir porque la ruta que estamos dándole al interprete no es la correcta!!

Pero si probamos agregar el archivo pirata.txt a donde se encuentra el .py si lo abre, por ende el código esta funcionando bien y es correcto.

 

Paso 3: Forzamos a dar la ubicación en un input

 

Ahora vamos a colocar una variable como nombre de archivo, a la cual llamaremos dirarchivo y seguidamente vamos a colocar en el except un input para que el usuario se vea forzado a dar la ubicación de dicho archivo quedando nuestro código así:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  sin título.py
#  
#  Copyright 2018 https://pythones.net
#
dirarchivo = "piratas.txt"
while True: #Creamos un bucle infinito
    try: #Intentamos abrirlo
        with open (dirarchivo, "r+") as f: #Abrimos utilizando Reescribir (r+)
            contenido = f.read()  #<-Lo abrimos utilizando el método read
            print (contenido)
            break
    except:
        print("Error al intentar abrir")
        print (("No se encuentra el archivo"),(dirarchivo), ("Especifique su ubicación:"))
        dirarchivo = (input("Dirección:"))

Resultado en Gif:

Programa que abre archivos según ubicación

Espero que te haya encantado como a mi lo bien que funciona!! ^^

 

A tener en cuenta a la hora de utilizar archivos

Aprender a trabajar correctamente los archivos nos abre muchas posibilidades, no solo el hecho de crear un texto a mi forma de verlo podemos manipular archivos del sistema y programas modificando configuraciones. También podemos crear un código que nos cree y edite otros «.py». O nos permite reescribir archivos masivamente. Suponiendo que tengas muchos archivos  y quieras agregarle algún copyright o marca personal. Puede permitirte también crear un txt lleno de contraseñas, emails, información útil. Que tu imaginación no te detenga sólo en los cutres .txt y en lo llano sobre lo que aprendes, intenta experimentar con el código.

Adiooos!Esto es todo mi querido lector, me despido cordialmente esperando que te halla gustado esta entrada y por sobre todo te haya ayudado a comprender este maravilloso lenguaje! Un cordial abrazo y nos vemos en la siguiente entrada!! Gracias por visitar mi blog!

 

 

 


 

Sigue leyendo!
Entrada anterior! Siguiente entrada!

Compartir es agradecer! :)

10 comentarios en “Archivos en Python – Métodos del objeto file y modos de apertura”

  1. estimado profesor, venia bien en todos las entradas del blog hasta que me tope con este ,, no lo entendi un pito, y no es que este mal esplicado , veo que esta muy detallado
    lo que no entiendo es para que sirve abrir un arvhivo txt en python ……

    1. Hola @norvin_sanchez:disqus no me considero profesor mas bien un alumno!. En cuanto a tu pregunta numerosos scripts suelen cargar datos a partir de .txt’s . Un ejemplo que conozco en carne propia son los scripts de fuerza bruta (hacking) que se programan en Python y suelen trabajar con diccionarios disponibles en la red o personalizables por el usuario los cuales se cargan a partir de un archivo de texto. Permitiendo que el usuario pueda modificar los datos sin «toquetear» el código. Así podríamos por ejemplo también en diferentes casos almacenar datos en un txt como si fuera una base de datos local y luego accederla mediante iteración utilizando bucles. Evitando así al ejecutar un script de Python en consola «perder» avances en cuanto a datos almacenados por entrada de usuario o también nos permitiría generar log’s en casos de errores; almacenar datos del equipo que ejecuta el script; entre otros muchos miles de usos que tu imaginación te provea… Un cordial saludo

  2. Muy interesante el artículo, pero no he encontrado en ningún sitio solución a un posible problema.

    Estoy haciendo un proyecto en el que necesito, a través de un menú guardar varios proyectos, con distintos nombres.
    Hasta ahí todo bien, también he creado la función para que me cree un archivo .cvs el problema es que quiero introducir
    cada vez un nombre distinto al archivo csv y no he conseguido aplicar esa variable, cómo puedo hacerlo?
    Mi programa es algo así:

    def Fichero():
    print («Guardar fichero»)
    Archivo= input(«Introduzca el nombre del fichero: n»)
    print («Fichero guardado como: n «,Archivo)

    def Informe():
    print («Obtener informe»)
    with open(Archivo.csv,»w»,newline=»») as csvfile:
    for key in dict.keys():
    csvfile.write(«Proyecto: %sn»%(key))
    csvfile.write(«%sn»%(dict[key]))

    1. Nunca llamas a la funcion que pide el nuevo nombre.

      def Fichero():
      print («Guardar fichero»)
      Archivo= input(«Introduzca el nombre del fichero: n»)
      print («Fichero guardado como: n «,Archivo)

      def Informe():
      print («Obtener informe»)
      Archivo = Fichero()
      if Archivo: # Comprobamos que hayas escrito algo
      Archivo = Archivo + «.csv» # Agregamos la extensión
      with open(Archivo,»w»,newline=»») as csvfile:
      for key in dict.keys():
      csvfile.write(«Proyecto: %sn»%(key))
      csvfile.write(«%sn»%(dict[key]))

  3. En windows no me funciona bien el programa, en la parte cuando le pido al usuario la dirección. Pongo toda la ruta desde el disco C: hasta la carpeta donde esta el archivo y me marca error, dice que no esta el archivo en el fichero. A que se deberá?

  4. buenos días, muchas gracias por toda tu generosidad, estoy siguiendo tus lecciones, soy principiante en esto. Venia bien, tal cual como leí en un comentario anterior, hasta que llegue a esta lección y la verdad se me hizo una ensalada de fruta! No entendí lo de generación de archivo .txt . probé hacerlo pero no se me crea automáticamente un archivo en mi escritorio. Hay algo que estaré haciendo mal? Como no pude avanzar en ese punto, todo lo siguiente de la lección no lo puedo lograr.
    este es el codigo que hice en Geany:
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    #
    # prueba.archivotxtpy
    #
    # Copyright 2021 dmora
    #
    with open («Mia.txt», «w») as f:
    f.write («Hola soy Mia Ratti»)
    f.close()

  5. Hola Dana estás usando otro tipo de comillas; nose si has puesto doble comillas simple o algo así, pero debes usar las tradicionales dobles comillas de SHIFT + 2.
    Por tanto tienes un error de SINTAXIS. Fíjate aquí tu código no da error:

    with open («Mia.txt», «w») as f:
    f.write(«Hola soy Mia»)
    f.close()

    Te recomiendo que si tienes un poco más de idea uses algún editor con auto-completado, o detección temprana de errores de sintaxis como VScode o ATOM. Aunque Geany esta bien para comenzar quizás debas ayudarte más con la sintaxis. Mis saludos!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.