Saltar al contenido

Lectura y Escritura de ficheros en Python, con ejemplos

En este tutorial vamos a ver como leer y escribir ficheros en Python, dado que es una de las cosas que suele ser muy útil y utilizada a la hora de programar.

El proyecto de este post lo puedes descargar pulsando AQUI.

En este tutorial vamos a ver como leer y escribir ficheros en Python, dado que es una de las cosas que suele ser muy útil y utilizada a la hora de programar. Aunque la lectura y escritura de ficheros se puede hacer de varias formas, en este tutorial os vamos a dar el código necesario para realizar estas acciones.

Antes de pasar a explicar y a mostrar ejemplos de lectura y escritura, mostramos en la siguiente imagen un diagrama para ver los modos de lectura y escritura en python:

IO_Python_Jarroba

Lectura de Ficheros:

Vamos en primer lugar a leer el contenido del siguiente fichero (llamado 'fichero_leer.txt') e imprimir por pantalla lo que leemos:


Linea 1
Linea 2
Linea 3
Linea 4
Linea 5
Linea 6
Linea 7
Linea 8
Linea 9
Linea 10

En primer lugar tenemos que decir la ruta o directorio donde se encuentra el fichero que queremos leer, especificando la ruta donde se encuentra el fichero (ejem -> Windows: c:\\carpeta\……\fichero.txt,  Linux o Unix: \var\www\……\fichero.txt). 

dirFichero = './fichero_leer.txt'

Nota

Dado que estamos ejecutando este código en un sistema operativo Unix, estamos indicando con el símbolo '.' que el fichero se encuentra en la misma carpeta que el fichero python que estamos ejecutando, pero podíamos poner perfectamente la ruta absoluta para referenciar a este fichero.

Una vez que tenemos el fichero que queremos leer, abrimos el mismo en modo lectura ('r') y con un bucle 'for', vamos leyendo linea a linea el fichero y lo imprimimos por pantalla:

dirFichero = './fichero_leer.txt'
with open(dirFichero, 'r') as reader:
    for line in reader:
        print line

Siguiendo el diagrama de la primera imagen, queríamos leer el fichero desde el principio y por tanto hemos elegido la opción 'r', pero podíamos haber elegido también la opción 'r+' para leer el fichero desde el principio y sin borrar su contenido.

Por otro lado podemos también empezar a leer el fichero desde una posición concreta (o desde un byte concreto). Esto lo hacemos indicando con el métod 'seek(byte)' desde el byte que queremos empezar a leer. Veamos un ejemplo de ello, empezando a leer el fichero desde el byte 32, que correspondería comenzar a leer el fichero desde la linea 5:

with open(dirFichero, 'r') as reader:
    reader.seek(32)
    for line in reader:
        print line

Como resultado se imprimiría por pantalla lo siguiente:


Linea 5
Linea 6
Linea 7
Linea 8
Linea 9
Linea 10

Por último vamos a mostrar la opción 'w+' que tras leer el fichero borra su contenido. Esto se haría de la siguiente manera, pasandole como opción 'w+'

with open(dirFichero, 'w+') as reader:
    for line in reader:
        print line

Escritura de Ficheros:

Para la escritura de un fichero, vamos a poner un ejemplo en el que vamos a escribir cada elemento de una lista en una linea. Para ello abriremos un fichero con la opción 'w' (si existe el fichero borra su contenido y si no existe lo crea) y con el método 'write()' escribiremos el contenido que le pasemos como parámetro. Esto lo hacemos de la siguiente forma:

# Lista con las lineas a escribir en el fichero
lineas = ['Uno', 'Dos', 'Tres', 'Cuatro', 'Cinco', 'Seis', '...']

dirFichero = './fichero_escribir.txt'
fichero = open(dirFichero, 'w')
for l in lineas:
    fichero.write(l + '\n')
fichero.close()

Como resultado vamos a tener un fichero con el siguiente contenido:


Uno
Dos
Tres
Cuatro
Cinco
Seis
...

Por otra parte si lo que queremos es continuar escribiendo en el fichero sin borrar su contenido, debemos de aplicar la opción 'a+' que se posiciona al final del fichero sin borrar su contenido y en este caso empieza a escribir contenido a partir de esa posición:

# Lista con las lineas a escribir en el fichero
lineas = ['Uno', 'Dos', 'Tres', 'Cuatro', 'Cinco', 'Seis', '...']

dirFichero = './fichero_escribir.txt'
# Escribo en el fichero el contenido de la lista, sin borrar el contenido del fichero
fichero = open(dirFichero, 'a+')
for l in lineas:
    fichero.write(l + '\n')
fichero.close()

Como resultado, tenemos un fichero cuyo contenido es el contenido que había anteriormente (el contenido de la lista) más el nuevo contenido que hemos escrito que es la misma lista:


Uno
Dos
Tres
Cuatro
Cinco
Seis
...
Uno
Dos
Tres
Cuatro
Cinco
Seis
...

«Lectura y Escritura de ficheros en Python, con ejemplos», de Ricardo Moya en jarroba.com, con licencia Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0. Obra registrada en Safe Creative.

Ricardo Moya

Me dedico profesionalmente al Machine Learning y al Big Data. Me gusta aprender tecnologías nuevas y explicarlas de la mejor manera posible en esta web.

Te puede interesar

Curso de Python – 8. Ficheros

Aprende a trabajar con ficheros y directorios en Python: rutas con Path, lectura y escritura de ficheros, y ejercicios prácticos con datos de futbolistas.

17 Jul 2020

Ordenar listas en Python, con ejemplos

En este tutorial se van a mostrar las diferentes formas de ordenar una lista en Python, indicándole el campo, substring, atributo, etc. por el que ordenar.

30 Ago 2015

Comentarios (8)

  1. Luis Aliaga

    Cómo puedo generar un archivo csv sin borrar el anterior cada vez que le doy run al programa?

    1. Ramón Invarato Jarroba.com

      Buenas Luis.
      Si estás siguiendo el artículo, no se te tiene que borrar, ya que es solo lectura y escritura de ficheros. Si se te está borrando es porque en algún lugar del código se está invocando a:

      os.remove()
      

      O a:

      pathlib.Path.unlink()
      
  2. JUAN CARLOS GARZON BELTRAN

    Realizar una clase de prueba que lea líneas de dos ficheros y las imprima en orden en
    pantalla. Ejemplo, si el primer fichero tiene dos líneas «A» y «B» y el segundo fichero
    contiene dos líneas «C» y «D», debe imprimir «A», «B», «C» y «D». La solución debe utilizar
    internamente una cola.

    1. Ramón Invarato Jarroba.com

      Te respondí en el artículo de Java: https://jarroba.com/lectura-escritura-ficheros-java-ejemplos/
      Para Python lo mismo, lo único que tendrás que usar la ordenación de sort en Python como explicamos en https://jarroba.com/ordenar-listas-python-ejemplos/

  3. David

    cómo puedo borrar un dato desde una posición intermedia?

    1. Ramón Invarato Jarroba.com

      El tratamiento de los ficheros en Python es de una sola escritura, pudiendo añadir más datos al final del mismo. Para eliminar un dato intermedio existen varios acercamientos:
      -Crear otro fichero nuevo (o sobrescribir el mismo fichero que leemos), recorrer el antiguo para copiar su contenido y saltarnos los datos «eliminados» al momento de escribirlos. Esta aproximación para fichero grandes puede ser poco viable si cada vez que queramos borrar algo tenemos que volver a crear el fichero, pues tardaría bastante.
      -Utilizar un fichero intermediario (de indexación) para el marcado de los datos borrados (y a la hora de leer el fichero con todos los datos nos saltaríamos los datos que están marcados como borrados en este fichero intermedio). Para facilitar esto podemos utilizar el objeto Shelve () que ya lo implementa y que actúa como un diccionario pero en disco, permite modificar y borrar datos (aunque realmente los marca como borrados, pues los datos borrados siguen ocupando espacio aunque no los devolverá cuando pidamos alguno de los borrados). El problema de esta aproximación es que de vez en cuando necesitaremos tener que «desfragmentar» el fichero, pues los datos borrados ocupan sitio, con lo que podremos utilizar de vez en cuando el punto primero para «desfragmentar» (crear otro fichero sin los datos borrados, que ocupará bastante menos).
      -Y otra manera que me gusta menos por lo poco óptimo que es, si la información guardada tiene algún tipo de campo id, podremos escribir dicho registro con el mismo id al final del fichero; aquí lo único que tendríamos que hacer es quedarnos con el último id que sería el más actual (tendríamos que leer todo el fichero en memoria y quedarnos con el último registro que pertenezca a un mismo id); y si el último registro para el mismo id tuviera una «marca de borrado», entonces no lo devolveríamos. Esta aproximación tiene el mismo problema que el punto anterior, habría que «desfragmentar» el fichero de vez en cuando.

  4. Ferhertol

    Muchas gracias amigo, solo al ver el flujograma pude ver mi ridículo error

  5. Levy Cen

    Muy util, gracias, necesitaba esta explicación.

Deja un comentario


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