Lectura y escritura de archivos

La entrada y salida de ficheros (comúnmente llamada File I/O) es una herramienta que Python, como la mayoría de los lenguajes, nos brinda de forma estándar. Su utilización es similar a la del lenguaje C, aunque añade mayores caracterísitcas. Puedes encontrar la documentación oficial del tema Reading and Writing Files en este enlace.

El primer paso para introducirnos es saber cómo abrir un determinado archivo. Para esto se utiliza la función open, que toma como primer argumento el nombre de un fichero.

open("archivo.txt")

No está de más aclarar que esto no significa ejecutar el programa por defecto para editar el fichero, sino cargarlo en la memoria para poder realizar operaciones de lectura y escritura.

En caso de no especificarse la ruta completa, se utilizará la actual (donde se encuentre el script).

Como segundo argumento, open espera el modo (como una cadena) en el que se abrirá el fichero. Esto indica si se utilizará para lectura, escritura, ambas, entre otras.

open("archivo.txt", "r")

La r indica el modo lectura. Si se intentara utilizar la función write para escribir algo, se lanzaría la excepción IOError. A continuación los distintos modos.

  • r – Lectura únicamente.
  • w – Escritura únicamente, reemplazando el contenido actual del archivo o bien creándolo si es inexistente.
  • a – Escritura únicamente, manteniendo el contenido actual y añadiendo los datos al final del archivo.
  • w+, r+ o a+ – Lectura y escritura.

El signo '+' permite realizar ambas operaciones. La diferencia entre w+ y r+ consiste en que la primera opción borra el contenido anterior antes de escribir nuevos datos, y crea el archivo en caso de ser inexistente. a+ se comporta de manera similar, aunque añade los datos al final del archivo.

Todas las opciones anteriores pueden combinarse con una 'b' (de binary), que consiste en leer o escribir datos binarios. Esta opción es válida únicamente en sistemas Microsoft Windows, que hacen una distinción entre archivos de texto y binarios. En el resto de las plataformas, es simplemente ignorada. Ejemplos: rb, wb, ab+, rb+, wb+.

Por último, open() retorna una instancia de la clase file, desde la cual podremos ejecutar diversas operaciones.

f = open("archivo.txt", "w")

En este ejemplo he abierto el fichero archivo.txt que, en caso de no existir, será automáticamente creado en el directorio actual. A continuación escribiré algunos datos utilizando la función file.write.

f.write("Esto es un texto.")

Reiteradas llamadas a esta función añaden texto al archivo hasta que sea cerrado.

f.write("Esto es una linea.\n")
f.write("Esto es otra linea.\n")
f.write("Esta es la tercer linea.\n")

Nótese el uso del carácter '\n' para indicar el salto de línea.

Por último, cerramos el archivo.

f.close()


Con respecto a la lectura, las tres funciones disponibles son read, readline y readlines.

f = open("archivo.txt", "r")
content = f.read()
print(content)
f.close()

Imprime:

Esto es una linea.
Esto es otra linea.
Esta es la tercer linea.

Una segunda llamada a f.read() retornaría una cadena vacía, debido a que ya se ha obtenido todo el contenido.

print(f.readline())
print(f.readline())

Imprime:

Esto es una linea.

Esto es otra linea.

Nótse el carácter de nueva línea al final de la cadena retornada.


Para iterar entre todas las líneas de un archivo, ambos ejemplos resultan similares:

for line in f.readlines():
    print(line)

for line in f:
    print(line)

Resultado:

Esto es una linea.

Esto es otra linea.

Esta es la tercer linea.


file.seek() permite posicionarse en un determinado lugar del fichero. Ejemplo:

f.seek(30)
print(f.read())

Comienza a leer desde la posición 30, por lo que imprime:

ra linea.
Esta es la tercer linea.

A partir de Python 2.5 puede utilizarse with para asegurar que el archivo sea cerrado al finalizar su utilización, incluso si se produce un error.

with open("archivo.txt", "r") as f:
    content = f.read()

print(f.closed)  # True

Es equivalente a:

try:
    f = open("archivo.txt", "r")
    content = f.read()
finally:
    f.close()

Adicional para Python 2

Usuarios de la rama 2.x consideren utilizar codecs.open() en lugar de la convencional open(). Aquí está el porqué:

f = open("archivo.txt", "w")
f.write(u"Esto es una línea.")  # Nótese la tilde.
f.close()

Produce el siguiente error:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xed' in position 13: ordinal not in range(128)

El problema radica en que open() espera una cadena de tipo ASCII, por lo que al utilizar otras codificaciónes como UTF-8 la función falla.

import codecs

f = codecs.open("archivo.txt", "w", "utf-8")
f.write(u"Esto es una línea.")
f.close()

Este código es ejecutado sin problemas. codecs.open() añade un tercer argumento en el que puede especificarse la codificación.

Además, como alternativa, también puede utilizarse el módulo io con su función io.open, que extiende las funcionalidades de la interfaz tradicional.

Curso online 👨‍💻

¡Ya lanzamos el curso oficial de Recursos Python en Udemy! Un curso moderno para aprender Python desde cero con programación orientada a objetos, SQL y tkinter en 2024.

Consultoría 💡

Ofrecemos servicios profesionales de desarrollo y capacitación en Python a personas y empresas. Consultanos por tu proyecto.

8 comentarios.

  1. juan morales villalobos says:

    tengo un módulo que se llama igual-similar, al exportarlo el guíon medio lo toma como signo menos y no lo reconoce y arroja error, favor indicar instrucción para exportarlo y poder abrirlo y leerlo, sin cambiar el nombre del archivo igual-similar

    • Recursos Python says:

      ¿Tenés un módulo o un archivo que se llama igual-similar? Son cosas diferentes. Si es un módulo de Python, no puede tener guiones medios en el nombre. Si es un archivo cualquiera, no deberías tener problema en abrirlo vía open("igual-similar").

      Saludos

  2. Hola , una consulta, tengo un archivo txt que deseo utlizar con base de datos el cual esta delimitado por comas, cómo hago para poder manipularlo, en el sentido de por ejemplo buscar un dato en la columna 4, y utilizarlo para realizar otro cálculo.

    idcliente,cliente,tipocuenta,saldo
    12,juan perez,ahorrox, 1200
    34,rosa bado,ahorroy,1000

    como puedo hacer para obtener el saldo de la cuenta a partir del id del cliente, y a ese saldo poder darle un incremento del 10%, imprimirlo y finalmente actualizarlo.

    Te agradezco de antemano, saludos

    • Recursos Python says:

      Hola. Tenés un módulo estándar para trabajar con archivos CSV: csv. Si se te complica implementarlo, pasá por el foro y lo vemos mejor.

      Saludos

  3. una pregunta si el archivo que deseo editar lo obtuve desde un argumento pasado por consola ¿como lo abro?

    Ejemplo
    import sys, getopt

    def main(argv):
    inputfile = »
    outputfile = »

    try:
    opts, args = getopt.getopt(argv,»hi:o:»,[«ifile=»,»ofile=»])
    except getopt.GetoptError:
    print (‘test.py -i -o ‘)
    sys.exit(2)
    for opt, arg in opts:
    if opt == ‘-h’:
    print (‘ipfacebook -i -o ‘)
    sys.exit()
    elif opt in («-i», «–ifile»):
    inputfile = arg

    if(inputfile != »){
    inputfile = open(inputfile, ‘r’)

    }

    if __name__ == «__main__»:
    main(sys.argv[1:])

    • Recursos Python says:

      Simplemente debes pasar el nombre del archivo a la función open. En Python no se utilizan las llaves para determinar una porción de código, sino que siempre la tabulación o espacios (4 generalmente); ese sería el principal problema en tu código.

      Un saludo.

Deja una respuesta