Me he levantado con ganas de dar un pasito más en el idílico romance de mi pueblo con Noruega (y de mi propia persona con Python). Necesito que mi script lea un archivo y utilice la lista de nombres que contenga para poder seguir añadiendo nuevos nombres sin perder los anteriores.
Voy a tener algún problema fuera del script en sí mismo, porque el otro día, atraído por la situación, vino a vivir al pueblo un noruego. A ver cómo le genero un nombre noruego a un noruego… tendré que hablar con él para saber si lo necesita o le vale su propio nombre. En fin, voy a centrarme en Python.
El script que tengo se inicia y genera un diccionario que puedo ir rellenando con nombres hasta que decida que ya no quiero añadir más. En ese momento puedo indicar que he terminado y el script finaliza guardando en un archivo el diccionario, borrando el contenido que el archivo tenía.
El problema es que yo quiero que mi script, al ejecutarse, lea el archivo donde tengo los nombres noruegos guardados y los introduzca en el diccionario vecinos.
He estado probando y tengo un grave problema a solucionar (ya he llamado a mi primo y le he dejado caer algo, creo haber oído un insulto mientras colgaba, está estresado con mis dudas el pobre). Python puede leer mi archivo e incluso guardar el contenido, pero lo guarda como texto, no como un diccionario. He intentado decirle instrucciones como guardalo.como.un.diccionario() pero no funcionan… así que me toca volver a googlear en busca de información.
Lo primero es ver cómo es la información que he guardado en el archivo en una de mis pruebas:
{'Maria': 'Kristin Holt', 'Fede': 'Bjorn Solberg', 'Pepe': 'Kjell Andersen'}
Voy a buscar cómo conseguir que la clave sea únicamente el nombre en castellano y el valor sea únicamente el nombre y apellido noruego. Para ello necesito que no haya comillas, ni llaves, ni comas, ni espacios.
He encontrado una función para sustituir diferentes caracteres de un texto almacenado en una variable (resulta que, según mi primo, al texto en programación se le llama string), se llama replace.
vecinos.replace(“lo que quiero eliminar”,”lo que tiene que sustituirlo”)
Sustituiré lo que quiero por nada, que al fin y al cabo es como eliminarlo.
vecinos.replace(“{“,””)
Voy a convertir el diccionario vecinos en un string para poder probarlo por terminal antes de incluirlo en el programa:
vecinos = {'Maria': ' Kristin Holt', 'Fede': 'Bjorn Solberg', 'Pepe': ' Kjell Andersen'} vecinos = str(vecinos) vecinos = vecinos.replace(“{“,””) vecinos = vecinos.replace(“}”,””) vecinos = vecinos.replace(“‘“,””) print (vecinos)
¡Ha funcionado! Ahora ya he conseguido quitar signos que no necesito a la hora de aislar clave y valor. Lo que tengo claro es que cada par clave – valor de mi diccionario vecinos está separado por una coma y un espacio y que la clave está separada del valor por dos puntos y un espacio. Quizá hay una función que separe un string en diferentes elementos…
Mira, he encontrado una, split. Divide un string en dos partes, la que hay a la izquierda del carácter o caracteres que elijas y la que hay a la derecha:
vecinos = vecinos.split(“, “) print (vecinos)
¡Parece que ha convertido mi string en una lista! Cada elemento de la lista contiene el nombre en castellano y en noruego separados por dos puntos. Voy a comprobarlo con un comando que vi el otro día:
type (vecinos)
Efectivamente, es un class ‘list’, así que es una lista. Ahora tengo que usar de nuevo split, pero para cada elemento de la lista. Tengo que dividirlo en clave y valor y, una vez dividido, almacenarlo en un diccionario.
Voy a crear un diccionario_vecinos para esta prueba y voy a ir recorriendo mi lista, partiendo cada elemento en dos por los dos puntos y el espacio posterior. Cada elemento, al partirse, se convertirá en una lista de dos elementos que podré ir guardando en el diccionario diciendo que la clave es la posición 0 y el valor la posición 1:
diccionario_vecinos = dict() for vecino in vecinos: vecino = vecino.split(“: ”) diccionario_vecinos[vecino[0]] = vecino[1] print (diccionario_vecinos)
Jolín, con esto me mandan al Valhalla… ¡menudo éxito! Ya tengo un diccionario, voy a asegurarme…
¡Efectivamente! es un class ‘dict’. ¡Oh Lá Lá! (si, no es muy noruego, pero no conozco ninguna expresión noruega de júbilo).
Vale, ahora necesito que mi script, al iniciarse, haga todo ese proceso él solito y me guarde en vecinos el contenido de mi archivo nombres_noruegos.txt. Para ello, previamente tengo que abrir mi archivo en modo lectura, guardar el contenido en una variable (se guardará como string) y posteriormente hacer lo que he hecho en el ejemplo anterior, algo así vaya:
archivo = open(“nombres_noruegos.txt”,”r”) lista = archivo.read() archivo.close() lista = lista.replace(“{“,””) lista = lista.replace(“}”,””) lista = lista.replace(“‘“,””) lista = lista.split(“, “) for elemento in lista: elemento = elemento.split(“: “) vecinos[elemento[0]] = elemento[1]
Voy a incluirlo en el script:
Ahora sólo necesito ir abriendo y cerrando el archivo y generando nuevos nombres para probarlo. Voy a abrir el script, que cargará el archivo nombres_noruegos.txt, que contiene lo siguiente:
{'Maria': 'Kristin Holt', 'Fede': 'Bjorn Solberg', 'Pepe': 'Kjell Andersen'}
Oye, pues ha funcionado. Tengo un diccionario obtenido de un archivo, ¡qué pasada!
Voy a informar a mi primo para que vea mis progresos, seguro que le saca alguna pega al asunto…
Efectivamente, le ha sacado una pega. Si es la primera vez que abro el programa y no he creado el archivo .txt del que voy a leer, me da un error, voy a eliminar el archivo y a probar:
Tenía razón el muy… programador. Me ha dado una solución, así que por esta vez le perdono. Resulta que hay una opción que es try, es decir, prueba. Puedes poner un try y un except, Python tratará de realizar la acción que contenga el try y si no lo consigue hará el except.
He puesto dentro del except un pass para que, en caso de no poder cargar el archivo, Python no haga nada y continúe con el programa. Voy a probarlo borrando el archivo nombres_noruegos.txt:
Pues sí, no ha dado error. Se ha abierto el script y se ve claramente que nuestra lista de vecinos está vacía… ¡Qué contento estoy! Parece que por fin he terminado, aunque reconozco que la forma de guardar un diccionario en un archivo es un poco rudimentaria. En esta ocasión no voy a preguntarle a mi primo, que me tiene frito, me quedo así y voy trabajando con este maravilloso script.
Vale, no he podido evitar preguntarle, hemos coincidido en el partido del equipo del pueblo (resulta que lo han llamado Valhalla’s Vikings, esto está saliéndose de madre). Me ha apuntado una serie de cosas en una servilleta para que investigue:
No se qué de que use json, me dijo que tenía que cambiar por mis nombres de archivos los suyos y sustituir dict por mi diccionario y fichero por mi fichero… Voy a hacer como que no he visto esta servilleta y algún día investigaré sobre ello porque parece ser que mi script es mejorable (a ojos de un programador). To be continued…
Yo de momento me conformo con mi espectacular script generador de nombres noruegos aleatorios para Villarubias. ¡Por Odín!