Bienvenidos sean a este post, en el post anterior vimos como leer archivos pero hoy veremos como escribir los mismos.
Escribiendo un archivo desde otro archivo
Como dijimos anteriormente vimos como leer archivos pero a continuacion veremos como es la sintaxis para escribir en su forma mas basica:
>>> with open('ejemplo.txt', 'w') as fw:
... print('Estamos escribiendo en un archivo', file=fw)
...
>>>
De vuelta con with abrimos un archivo, este nos asegura que el archivo se cerrara cuando se termina la ejecucion, al cual llamaremos ejemplo.txt y le pasaremos la opcion w para indicar que escribiremos en este, el objeto sera fw y por medio de print pasaremos un texto, lo siguiente sera indicarle a donde debe salir y en este caso sera a un archivo (file) seguido del objeto que contiene al archivo donde vamos a escribir, despues de esto cerramos el archivo automaticamente porque usamos el with, con esto cubrimos lo basico para escribir en un archivo si desean pueden chequearlo de la siguiente forma:
>>> with open('ejemplo.txt') as fr:
... for linea in fr:
... print(linea.strip())
...
Estamos escribiendo en un archivo
>>>
Esto lo explicamos en el post anterior pero podemos ver como se escribio correctamente, vamos a trabajar con el archivo prueba.txt que generamos en el post anterior y haremos una copia de este sino lo tiene deben crear un archivo llamado prueba.txt y agregar el siguiente texto:
prueba.txt
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
Con el archivo creado nuestro siguiente paso sera crear un nuevo archivo que llamaremos copiar.py y le agregaremos el siguiente codigo:
copiar.py
with open('prueba.txt') as f:
lineas = [linea.strip() for linea in f]
with open('prueba_copia.txt', 'w') as fw:
fw.write('\n'.join(lineas))
En este codigo vamos a aplicar ambos casos, donde primero leeremos el archivo haremos lista a la cual llamaremos lineas y almacenaremos todo el contenido del archivo en este, una vez terminado procedemos a pasar escribir un archivo que lo identificaremo como prueba_copia.txt y utilizaremos la opcion w para escribir y lo asignaremos al objeto fw, despues por medio de write escribiremos cada una de las lineas pero para poder ver linea por linea debemos usar al modificador \n para generar una nueva linea por cada una de las pasadas por join de lineas, si lo probamos sucedera lo siguiente
En el video podemos ver como se realizo la tarea solicitada que consiste en tomar la informacion de un archivo y pasarla a otro, con esto concluimos con este tema pasemos al siguiente.
Leer y escribir pero en binario
Todos los lenguajes nos permiten trabajar los archivos de dos formas, texto y binario, el modo de texto es la forma mas practica para nosotros porque nos permite ver el contenido de una forma que entendamos, tal como hicimos hasta ahora, pero en la otra forma es mas entendible para nuestro ordenador dado que lo hace de una forma que ella entiende perfectamente, esto es util dependiendo de las tareas porque como deduciran de esta forma es mas eficiente que el texto dado que la computadora no debe convertir en binario la informacion para procesarla y luego volverla a texto o ASCII para que la entendamos, su forma de trabajo es similar a la anterior pero debemos especificar que es binario, veamos el siguiente ejemplo:
>>> with open('ejemplo.bin', 'wb') as fw:
... fw.write(b'Este es un texto binario')
...
24
>>>
Observen como trabaja de la misma forma pero a la hora de pasar la opcion de escritura lo hacemos acompañado de la b para indicar que es un archivo binario, luego al pasar la informacion a escribir le anteponemos la letra b para que ese texto sea considerado como binario, una vez creado nos informa el tamaño del texto ingresado, ahora procedamos a recuperar la informacion mediante el siguiente codigo:
>>> with open('ejemplo.bin', 'rb') as f:
... print(f.read())
...
b'Este es un texto binario'
>>>
Como pueden ver es similar a la lectura de archivos que vimos en el primer ejemplo del post anterior pero en lugar de usar rt como opcion para indicar que lee texto usaremos a rb para indicar que lea binario y despues le diremos que imprima el contenido haciendo efectivamente eso, si se preguntan para que nos puede servir; esto es especialmente util cuando tenemos que manejar archivos los cuales no son textos por ejemplo fotos, audios o videos, pasemos al ultimo tema.
Como evitar sobreescritura de archivo
Hasta ahora vimos como escribir un archivo pero que sucede si nosotros asignamos un nombre de archivo a uno existente? Si utilizamos la w este lo sobreescribira y perderemos toda la informacion anterior, esto no es importante si no nos interesa la informacion del archivo pero si esta es importante podemos desencadenar un problema grave, para evitar esto debemos usar la opcion x en lugar de w, vamos a ver el siguiente ejemplo:
>>> with open('ejemplo.x.txt', 'x') as fw:
... fw.write('Linea 1 escrita')
...
15
>>>
Como les dije anteriormente la forma de escribir es exactamente la misma pero en lugar de pasar w como opcion ahora le pasemos x, con esto creamos el nuevo archivo vamos a probar de sobreescribirlo:
>>> with open('ejemplo.x.txt', 'x') as fw:
... fw.write('Linea 2 escrita')
...
Volvemos a ejecutar el mismo ejemplo con el mismo archivo pero con otro texto para nuestro archivo, veamos que sucede:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileExistsError: [Errno 17] File exists: 'ejemplo.x.txt'
>>>
En este caso nos devuelve una excepcion porque el archivo ya existe y de esta forma evitamos que se sobreescriba, si se preguntan porque no trabajamos de esta forma directamente, es debido a que tiene una performance mas baja que el otro porque primero debe chequear si el archivo ya existe en cambio con w no hace este paso y crea el archivo, en estos ejemplos no notaran la diferencia pero con grandes cantidades de archivos si la veran, con esto cubrimos como escribir archivos.
En resumen, hoy hemos visto todas las posibilidades de como escribir archivos, desde la forma mas basica, pasando por la opcion de escribir en base al contenido en otro archivo, tambien como trabajar con archivos binarios y como evitar de sobreescribir un archivo existente, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
