Lectura y Escritura de ficheros en Python, con ejemplos
El proyecto de este post lo puedes descargar pulsando AQUI.
En este tutorial vamos a ver como leer y escribir fichero en Python, dado que es una de las cosas que suele ser muy util 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:
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'
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 ...
Cómo puedo generar un archivo csv sin borrar el anterior cada vez que le doy run al programa?
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:
O a:
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.
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/
cómo puedo borrar un dato desde una posición intermedia?
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.
Muchas gracias amigo, solo al ver el flujograma pude ver mi ridículo error
Muy util, gracias, necesitaba esta explicación.