Archivos .txt
Escritura de archivos
Siguiendo con la lógica de la entrada anterior, una vez creado (y abierto) el archivo deberemos traslacar a él los datos generados por nuestro script, procedimiento llamado escritura. Dedicaremos esta entrada a explicar las diferentes formas que tenemos de escribir en un archivo .txt desde un script de Python.
Como sabemos, de las instrucciones que usamos como concreción del segundo parámetro de la función open(), tres nos permiten escribir en el archivo: "x", "w" y "a". Cada una de ellas tiene un comportamiento particular, tanto respecto a la existencia previo (o no) del archivo, como al modo de trabajar con él.
La opción "x" (create) parece ser la más apropiada, pero tiene un inconveniente: si el archivo que pretendemos crear ya existe, devuelve error, por lo que es necesario asegurar que dicho archivo no exista. La opción "w" crea el archivo si éste no existe y no devuelve error, pero borrar lo que contenga ya que sitúa el cursor al inicio del archivo. Por último, la opción "a" funciona igual que la anterior pero no altera el contenido previo del archivo en caso de que éste exista, dado que situa el cursor al final del archivo.
Sabiendo lo anterior podemos optar por la opción que mejor se ajuste a nuestras necesidades. Por ejemplo, si lo que necesitamos es crear un nuevo archivo sabiendo con certeza que no existe, cualquiera de las tres opciones es válida. Aunque "x" parece ser la más específica, en realidad las tres tienen el mismo comportamiento prático, ya que la posición del cursor dentro del archivo (posición de partida para escribir en él) siempre será el inicio del mismo.
Si lo que deseamos es continuar escribiendo en un archivo ya creado, la mejor opción es "a", ya que nos garantiza que se respeta el contenido previo y que el nuevo se escribe a continuación. Pero si nuestro cometido es mantener actualizado y sin redundancias un determinado archivo, la mejor opción es "w", ya que nos garantiza que no se producirá error (como en el caso de "x) si el archivo ya existe, y que el documento siempre estará actualizado.
Vamos a explicar a continuación el proceso mismo de escritura, empezando por utilizar la función write() en su forma de uso más simple. Un ejemplo...
archivo = open('texto1.txt','x', encoding='utf-8')
archivo.write('Pedro como plátanos')
archivo.close()
... y una variación sobre el mismo tema, sustituyendo la cadena por la variable que la referencia...
frase ='Pedro come plátanos'
archivo = open('texto1.txt','x', encoding='utf-8')
archivo.write(frase)
archivo.close()
... y una tercera formulación, más sofisticada e interactiva, pero en lo principal, la misma:
nombre = input('Dime el nombre de la persona: ')
verbo = input(f'¿Qué hace {nombre }? ')
objeto = input(f'¿Qué {verbo} {nombre} ')
frase = (f'{nombre} {verbo} {objeto}') #Concetana el contenido de las tres variables
archivo = open('texto1.txt','x', encoding='utf-8')
archivo.write(frase)
archivo.close()
También podemos trabajar con colecciones de datos y con bucles, previamente a la escritura del contenido en el archivo y en proceso de escritura. Pensemos, por ejemplo, en una lista de vocabulario básico que almacenamos inicialmente en una lista y que después escribimos en un archivo.
frutas=['Pera','Plátano','Manzana','Naranja','Fresa']
archivo = open('texto1.txt','x', encoding='utf-8')
for fruta in frutas:
archivo.write(fruta)
archivo.close()
Aunque este script nos permite crear, acceder y escribir en el archivo texto1.txt, el problema que nos encontramos al acceder al contenido del archivo es el siguiente: "PeraPlátanoManzanaNaranjaFresa". Todas las palabras se escribieron juntas, en una misma línea, cosa que normalmente no es lo que se espera. Para evitar este problemas y que el resultado sea una lista legible, inlcuso que se escriban en líneaa diferentes, deberemos plantearnos otras formulaciones.
- Por ejemplo, si usamos la siguiente instrucción
archivo.write(' ')trasarchivo.write(fruta)obtendremos "b>Pera Plátano Manzana Naranja Fresa". La razón es que tras cada elemento de la lista escribimos un espacio mediante esa nueva instrucción. - Siguiendo este procedimiento, y manteniendo la escritura del listado en una misma línea, podemos añadir cualquier carácter o grupo de caracteres para separar cada elemento de la lista, como, por ejemplo sustituyendo
archivo.write(' ')porarchivo.write('||'), con lo que obtendremos "Pera||Plátano||Manzana||Naranja||Fresa||". - Estarás pensando que si usas el carácter salto de línea es posible escribir la lista en diferentes líneas (
archivo.write('\n')). Y estarás en lo cierto.
for fruta in frutas: lo obtenemos usando join() como te muestro en el siguiente script:
frutas=['Pera','Plátano','Manzana','Naranja','Fresa']
archivo = open('texto1.txt','x', encoding='utf-8')
texto = '\n'.join(frutas) #Si no queremos saltos de línea podemos usar, por ejemplo '||'
archivo.write(texto)
archivo.close()
... con el que conseguimos el mismo efecto que con la anterior formulación del script con bucle.
Cuando el texto a guardar es de varias líneas, podemos usar el método writelines() en sustitución de writer(). También este método nos ahorra el uso del bucle, ya que escribe las múltiples líneas de las que puede estar compuesto un texto o los diferentes elementos de una lista...
frutas=['Pera','Plátano','Manzana','Naranja','Fresa']
archivo = open('texto1.txt','x', encoding='utf-8')
archivo.writelines(frutas)
archivo.close()
... pero tiene un problema: o modificamos la lista introduciendo "separadores" entre su elementos, o lo que se escribe es una única "palabra" ("PeraPlátanoManzanaNaranjaFresa"). Y ya puestos a ahorrar, si queremos prescindir de la función close() (en archivo.close()) podemos recurrir a with, como, por ejemplo...
frutas = ['Manzana\n', 'Pera\n','Plátano\n']
with open "texto1.txt",'w', encoding='utf-8' as archivo:
archivo writelines(frutas)
... cuyas sentencias subordinadas (en este caso archivo writelines (frutas)) podemos formular de formas similares a como hicimos en los ejemplos anteriores.
No hay comentarios:
Publicar un comentario
Comenta esta entrada