Está en la página 1de 27

7 DE MAYO DE 2020/#PITÓN

Escritura en archivo de Python: explicación de las funciones de


abrir, leer, agregar y otras funciones de manejo de archivos

Estefania Cassingena Navone


Bienvenido
¡Hola! Si desea aprender a trabajar con archivos en Python, este artículo
es para usted. Trabajar con archivos es una habilidad importante que
todo desarrollador de Python debería aprender, así que comencemos.

En este artículo, aprenderá:


 Cómo abrir un archivo.

 Cómo leer un archivo.


 Cómo crear un archivo.
 Cómo modificar un archivo.
 Cómo cerrar un archivo.
 Cómo abrir archivos para múltiples operaciones.
 Cómo trabajar con métodos de objeto de archivo.
 Cómo eliminar archivos.
 Cómo trabajar con administradores de contexto y por qué son
útiles.
 Cómo manejar las excepciones que podrían generarse cuando
trabaja con archivos.
 ¡y más!
¡Vamos a empezar! ✨
🔹 Trabajar con archivos: sintaxis básica
Una de las funciones más importantes que necesitará usar cuando trabaje
con archivos en Python es open(), una función integrada que abre un
archivo y permite que su programa lo use y trabaje con él.
Esta es la sintaxis básica :
💡 Consejo: estos son los dos argumentos más utilizados para llamar a
esta función. Hay seis argumentos opcionales adicionales. Para obtener
más información sobre ellos, lea este artículo en la documentación.
Primer Parámetro: Archivo
El primer parámetro de la open()función es file, la ruta absoluta o
relativa al archivo con el que está tratando de trabajar.
Por lo general, usamos una ruta relativa, que indica dónde se encuentra
el archivo en relación con la ubicación del script (archivo de Python) que
llama a la open()función.
Por ejemplo, la ruta en esta llamada de función:

open("names.txt") # The relative path is "names.txt"


Solo contiene el nombre del archivo. Esto se puede usar cuando el
archivo que intenta abrir está en el mismo directorio o carpeta que el
script de Python, así:
Pero si el archivo está dentro de una carpeta anidada, así:

El archivo names.txt está en la carpeta "datos".


Luego, debemos usar una ruta específica para decirle a la función que el
archivo está dentro de otra carpeta.

En este ejemplo, esta sería la ruta:

open("data/names.txt")
Fíjate que estamos escribiendo data/primero (el nombre de la carpeta
seguido de un /) y luego names.txt(el nombre del archivo con la
extensión).
💡 Tip: Las tres letras .txtque siguen al punto names.txtson la
"extensión" del archivo, o su tipo. En este caso, .txtindica que se trata
de un archivo de texto.
Segundo parámetro: modo
El segundo parámetro de la open()función es el mode, una cadena con un
carácter. Ese carácter único básicamente le dice a Python lo que planea
hacer con el archivo en su programa.
Los modos disponibles son:

Leer ( "r").
 Agregar ( "a")
 escribir ( "w")
 Crear ( "x")
También puede optar por abrir el archivo en:

 Modo de texto ( "t")


 Modo binario ( "b")
Para usar el modo de texto o binario, deberá agregar estos caracteres al
modo principal. Por ejemplo: "wb"significa escribir en modo binario.
💡 Sugerencia: los modos predeterminados son lectura ( "r") y texto
( "t"), que significa "abrir para leer texto" ( "rt"), por lo que no es
necesario que los especifique open()si desea usarlos porque están
asignados de forma predeterminada. Simplemente puede
escribir open(<file>).
¿Por qué Modos?
Realmente tiene sentido que Python otorgue solo ciertos permisos en
función de lo que planea hacer con el archivo, ¿verdad? ¿Por qué Python
debería permitir que su programa haga más de lo necesario? Esta es
básicamente la razón por la que existen los modos.
Piénselo: permitir que un programa haga más de lo necesario puede ser
problemático. Por ejemplo, si solo necesita leer el contenido de un
archivo, puede ser peligroso permitir que su programa lo modifique
inesperadamente, lo que podría generar errores.

🔸 Cómo leer un archivo


Ahora que sabe más sobre los argumentos que open()toma la función,
veamos cómo puede abrir un archivo y almacenarlo en una variable para
usarlo en su programa.
Esta es la sintaxis básica:

Simplemente estamos asignando el valor devuelto a una variable. Por


ejemplo:

names_file = open("data/names.txt", "r")


Sé que te estarás preguntando: ¿qué tipo de valor devuelve open()?
Bueno, un objeto de archivo .
Hablemos un poco de ellos.

Objetos de archivo
Según la documentación de Python , un objeto de archivo es:
Un objeto que expone una API orientada a archivos (con métodos como
read() o write()) a un recurso subyacente.
Básicamente, esto nos dice que un objeto de archivo es un objeto que nos
permite trabajar e interactuar con archivos existentes en nuestro
programa de Python.

Los objetos de archivo tienen atributos, como:

 nombre : el nombre del archivo.


 cerrado : Truesi el archivo está cerrado. Falsede lo contrario.
 modo : el modo utilizado para abrir el archivo.

Por ejemplo:

f = open("data/names.txt", "a")
print(f.mode) # Output: "a"
Ahora veamos cómo puede acceder al contenido de un archivo a través
de un objeto de archivo.
Métodos para leer un archivo
Para que podamos trabajar con objetos de archivo, necesitamos tener una
forma de "interactuar" con ellos en nuestro programa y eso es
exactamente lo que hacen los métodos. Veamos algunos de ellos.

Leer()
El primer método que debe conocer es read(), que devuelve todo el
contenido del archivo como una cadena.

Aquí tenemos un ejemplo:

f = open("data/names.txt")
print(f.read())
La salida es:

Nora
Gino
Timmy
William
Puede usar la type()función para confirmar que el valor devuelto
por f.read()es una cadena:
print(type(f.read()))
# Output
<class 'str'>
¡Sí, es una cuerda!

En este caso, se imprimió todo el archivo porque no especificamos un


número máximo de bytes, pero también podemos hacerlo.

Aquí tenemos un ejemplo:

f = open("data/names.txt")
print(f.read(3))
El valor devuelto está limitado a este número de bytes:

Nor
❗️ Importante: debe cerrar un archivo después de que se haya
completado la tarea para liberar los recursos asociados al archivo. Para
hacer esto, necesita llamar al close()método, así:

Readline() frente a Readlines()


Puede leer un archivo línea por línea con estos dos métodos. Son
ligeramente diferentes, así que veámoslos en detalle.
readline()lee una
línea del archivo hasta que llega al final de esa línea. Se
mantiene un carácter de nueva línea final ( \n) en la cadena.
💡 Consejo: Opcionalmente, puedes pasar el tamaño, la cantidad
máxima de caracteres que deseas incluir en la cadena resultante.

Por ejemplo:

f = open("data/names.txt")
print(f.readline())
f.close()
La salida es:

Nora
Esta es la primera línea del archivo.

Por el contrario, readlines()devuelve una lista con todas las líneas del


archivo como elementos individuales (cadenas). Esta es la sintaxis:
Por ejemplo:

f = open("data/names.txt")
print(f.readlines())
f.close()
La salida es:

['Nora\n', 'Gino\n', 'Timmy\n', 'William']


Observe que hay un \n(carácter de nueva línea) al final de cada cadena,
excepto la última.
💡 Consejo: Puedes obtener la misma lista con list(f).
Puede trabajar con esta lista en su programa asignándola a una variable o
usándola en un ciclo:

f = open("data/names.txt")

for line in f.readlines():


# Do something with each line

f.close()
También podemos iterar fdirectamente (el objeto de archivo) en un
bucle:
f = open("data/names.txt", "r")

for line in f:
# Do something with each line

f.close()
Esos son los principales métodos utilizados para leer objetos de
archivo. Ahora veamos cómo puedes crear archivos.

🔹 Cómo crear un archivo


Si necesita crear un archivo "dinámicamente" usando Python, puede
hacerlo con el "x"modo.
Veamos cómo. Esta es la sintaxis básica:

Aquí hay un ejemplo. Este es mi directorio de trabajo actual:

Si ejecuto esta línea de código:


f = open("new_file.txt", "x")
Se crea un nuevo archivo con ese nombre:

Con este modo, puede crear un archivo y luego escribir en él


dinámicamente utilizando métodos que aprenderá en unos momentos.

💡 Consejo: El archivo estará inicialmente vacío hasta que lo


modifiques.
Una cosa curiosa es que si intenta ejecutar esta línea nuevamente y ya
existe un archivo con ese nombre, verá este error:

Traceback (most recent call last):


File "<path>", line 8, in <module>
f = open("new_file.txt", "x")
FileExistsError: [Errno 17] File exists: 'new_file.txt'
Según la documentación de Python , esta excepción (error de tiempo de
ejecución) es:
Se genera al intentar crear un archivo o directorio que ya existe.
Ahora que sabe cómo crear un archivo, veamos cómo puede modificarlo.

🔸 Cómo modificar un archivo


Para modificar (escribir en) un archivo, debe usar el write()método. Tiene
dos formas de hacerlo (agregar o escribir) según el modo que elija para
abrirlo. Veámoslos en detalle.
Adjuntar
"Agregar" significa agregar algo al final de otra cosa. El "a"modo le
permite abrir un archivo para agregarle contenido.
Por ejemplo, si tenemos este archivo:
Y queremos agregarle una nueva línea, podemos abrirlo usando
el "a"modo (agregar) y luego, llamar al write()método, pasando el
contenido que queremos agregar como argumento.
Esta es la sintaxis básica para llamar al write() método:
Aquí hay un ejemplo:

f = open("data/names.txt", "a")
f.write("\nNew Line")
f.close()
💡 Consejo: observe que estoy agregando \nantes de la línea para
indicar que quiero que la nueva línea aparezca como una línea separada,
no como una continuación de la línea existente.
Este es el archivo ahora, después de ejecutar el script:

💡 Consejo: es posible que la nueva línea no se muestre en el archivo


hasta que se ejecute. f.close()
Escribe
A veces, es posible que desee eliminar el contenido de un archivo y
reemplazarlo por completo con contenido nuevo. Puede hacer esto con
el write()método si abre el archivo con el "w"modo.
Aquí tenemos este archivo de texto:
Si ejecuto este script:

f = open("data/names.txt", "w")
f.write("New Content")
f.close()
Este es el resultado:
Como puede ver, abrir un archivo con el "w"modo y luego escribir en él
reemplaza el contenido existente.
💡 Consejo: el write()método devuelve la cantidad de caracteres
escritos.
Si desea escribir varias líneas a la vez, puede usar el writelines()método,
que toma una lista de cadenas. Cada cadena representa una línea que se
agregará al archivo.
Aquí hay un ejemplo. Este es el archivo inicial:
Si ejecutamos este script:

f = open("data/names.txt", "a")
f.writelines(["\nline1", "\nline2", "\nline3"])
f.close()
Las líneas se añaden al final del archivo:
Abrir archivo para múltiples operaciones
Ahora sabe cómo crear, leer y escribir en un archivo, pero ¿qué sucede si
desea hacer más de una cosa en el mismo programa? Veamos qué sucede
si intentamos hacer esto con los modos que has aprendido hasta ahora:

Si abre un archivo en "r"modo (lectura) y luego intenta escribir en él:


f = open("data/names.txt")
f.write("New Content") # Trying to write
f.close()
Obtendrá este error:

Traceback (most recent call last):


File "<path>", line 9, in <module>
f.write("New Content")
io.UnsupportedOperation: not writable
De manera similar, si abre un archivo en "w"modo (escritura) y luego
intenta leerlo:
f = open("data/names.txt", "w")
print(f.readlines()) # Trying to read
f.write("New Content")
f.close()
Verá este error:
Traceback (most recent call last):
File "<path>", line 14, in <module>
print(f.readlines())
io.UnsupportedOperation: not readable
Lo mismo ocurrirá con el "a"modo (añadir).
¿Cómo podemos solucionar esto? Para poder leer un archivo y realizar
otra operación en el mismo programa, debe agregar el "+"símbolo al
modo, así:
f = open("data/names.txt", "w+") # Read + Write
f = open("data/names.txt", "a+") # Read + Append
f = open("data/names.txt", "r+") # Read + Write
Muy útil, ¿verdad? Esto es probablemente lo que usará en sus
programas, pero asegúrese de incluir solo los modos que necesita para
evitar posibles errores.

A veces, los archivos ya no son necesarios. Veamos cómo puedes


eliminar archivos usando Python.

🔹 Cómo eliminar archivos


Para eliminar un archivo con Python, debe importar un módulo
llamado osque contiene funciones que interactúan con su sistema
operativo.
💡 Sugerencia: un módulo es un archivo de Python con variables,
funciones y clases relacionadas.
En particular, necesita la remove() función. Esta función toma la ruta al
archivo como argumento y elimina el archivo automáticamente.
Veamos un ejemplo. Queremos eliminar el archivo
llamado sample_file.txt.

Para hacerlo, escribimos este código:

import os
os.remove("sample_file.txt")
La primera línea: import osse denomina "declaración de

importación". Esta declaración está escrita en la parte superior de
su archivo y le da acceso a las funciones definidas en el osmódulo.
 La segunda línea: os.remove("sample_file.txt")elimina el
archivo especificado.
💡 Consejo: puedes usar una ruta absoluta o relativa.
Ahora que sabes cómo eliminar archivos, veamos una herramienta
interesante... ¡Administradores de contexto!

🔸 Conozca a los administradores de contexto


Los administradores de contexto son construcciones de Python que harán
su vida mucho más fácil. Al usarlos, no necesita recordar cerrar un
archivo al final de su programa y tiene acceso al archivo en la parte
particular del programa que elija.

Sintaxis
Este es un ejemplo de un administrador de contexto utilizado para
trabajar con archivos:

💡 Consejo: el cuerpo del administrador de contexto debe estar


sangrado, al igual que sangramos bucles, funciones y clases. Si el código
no tiene sangría, no se considerará parte del administrador de contexto.
Cuando se ha completado el cuerpo del administrador de contexto, el
archivo se cierra automáticamente.

with open("<path>", "<mode>") as <var>:


# Working with the file...
# The file is closed here!

Ejemplo
Aquí hay un ejemplo:

with open("data/names.txt", "r+") as f:


print(f.readlines())
Este administrador de contexto abre el names.txtarchivo para
operaciones de lectura/escritura y asigna ese objeto de archivo a la
variable f. Esta variable se usa en el cuerpo del administrador de
contexto para hacer referencia al objeto de archivo.
Intentando leerlo de nuevo
Una vez que se ha completado el cuerpo, el archivo se cierra
automáticamente, por lo que no se puede leer sin abrirlo
nuevamente. ¡Pero espera! Tenemos una línea que intenta leerlo de
nuevo, justo aquí abajo:

with open("data/names.txt", "r+") as f:


print(f.readlines())

print(f.readlines()) # Trying to read the file again, outside of the context manager
Veamos qué pasa:

Traceback (most recent call last):


File "<path>", line 21, in <module>
print(f.readlines())
ValueError: I/O operation on closed file.
Este error se produce porque estamos tratando de leer un archivo
cerrado. Impresionante, ¿verdad? El administrador de contexto hace todo
el trabajo pesado por nosotros, es legible y conciso.

🔹 Cómo manejar las excepciones al trabajar con archivos


Cuando trabaja con archivos, pueden ocurrir errores. A veces, es posible
que no tenga los permisos necesarios para modificar o acceder a un
archivo, o que un archivo ni siquiera exista.

Como programador, debe prever estas circunstancias y manejarlas en su


programa para evitar bloqueos repentinos que definitivamente podrían
afectar la experiencia del usuario.
Veamos algunas de las excepciones más comunes (errores de tiempo de
ejecución) que puede encontrar cuando trabaja con archivos:

Error de archivo no encontrado


Según la documentación de Python , esta excepción es:
Se genera cuando se solicita un archivo o directorio pero no existe.
Por ejemplo, si el archivo que intenta abrir no existe en su directorio de
trabajo actual:

f = open("names.txt")
Verá este error:

Traceback (most recent call last):


File "<path>", line 8, in <module>
f = open("names.txt")
FileNotFoundError: [Errno 2] No such file or directory: 'names.txt'
Analicemos este error línea por línea:

 File "<path>", line 8, in <module>. Esta línea le dice que el


error se generó cuando <path>se estaba ejecutando el código en el
archivo ubicado en. Específicamente, cuando line 8se ejecutó
en <module>.
 f = open("names.txt"). Esta es la línea que causó el error.
 FileNotFoundError: [Errno 2] No such file or directory:
'names.txt'. Esta línea dice que FileNotFoundErrorse generó
una excepción porque el archivo o directorio names.txtno existe.
💡 Consejo: Python es muy descriptivo con los mensajes de error,
¿verdad? Esta es una gran ventaja durante el proceso de depuración.
Error de permiso
Esta es otra excepción común cuando se trabaja con archivos. Según
la documentación de Python , esta excepción es:
Se genera cuando se intenta ejecutar una operación sin los derechos de
acceso adecuados, por ejemplo, permisos del sistema de archivos.
Esta excepción se genera cuando intenta leer o modificar un archivo que
no tiene permiso de acceso. Si intenta hacerlo, verá este error:

Traceback (most recent call last):


File "<path>", line 8, in <module>
f = open("<file_path>")
PermissionError: [Errno 13] Permission denied: 'data'

Es un error de directorio
Según la documentación de Python , esta excepción es:
Se genera cuando se solicita una operación de archivo en un directorio.
Esta excepción en particular se genera cuando intenta abrir o trabajar en
un directorio en lugar de un archivo, así que tenga mucho cuidado con la
ruta que pasa como argumento.

Cómo manejar las excepciones


Para manejar estas excepciones, puede usar una
instrucción try/except . Con esta declaración, puede "decirle" a su
programa qué hacer en caso de que suceda algo inesperado.
Esta es la sintaxis básica:

try:
# Try to run this code
except <type_of_exception>:
# If an exception of this type is raised, stop the process and
jump to this block

Aquí puedes ver un ejemplo con FileNotFoundError:


try:
f = open("names.txt")
except FileNotFoundError:
print("The file doesn't exist")
Esto básicamente dice:

Intenta abrir el archivo names.txt.



 Si FileNotFoundErrorse lanza un, ¡no se estrelle! Simplemente
imprima una declaración descriptiva para el usuario.
💡 Consejo: puedes elegir cómo manejar la situación escribiendo el
código apropiado en el exceptbloque. Quizás podría crear un nuevo
archivo si aún no existe.
Para cerrar el archivo automáticamente después de la tarea
(independientemente de si se generó una excepción o no en
el trybloque), puede agregar el finallybloque.
try:
# Try to run this code
except <exception>:
# If this exception is raised, stop the process immediately and
jump to this block
finally:
# Do this after running the code, even if an exception was
raised
Esto es un ejemplo:

try:
f = open("names.txt")
except FileNotFoundError:
print("The file doesn't exist")
finally:
f.close()
Hay muchas formas de personalizar la declaración try/except/finally e
incluso puede agregar un elsebloque para ejecutar un bloque de código
solo si no se generaron excepciones en el trybloque.
💡 Sugerencia: para obtener más información sobre el manejo de
excepciones en Python, puede leer mi artículo: "Cómo manejar
excepciones en Python: una introducción visual detallada" .
🔸 En Resumen
 Puede crear, leer, escribir y eliminar archivos con Python.
 Los objetos de archivo tienen su propio conjunto de métodos que
puede usar para trabajar con ellos en su programa.
 Los administradores de contexto lo ayudan a trabajar con archivos
y administrarlos cerrándolos automáticamente cuando se completa
una tarea.
El manejo de excepciones es clave en Python. Las excepciones

comunes cuando trabaja con
archivos incluyen FileNotFoundErrory . Se pueden manejar
usando
try/except/else/finally.PermissionErrorIsADirectoryError
Realmente espero que les haya gustado mi artículo y lo hayan
encontrado útil. Ahora puede trabajar con archivos en sus proyectos de
Python. Consulta mis cursos online. Sígueme enTwitter.

También podría gustarte