21 nov 2010

Conversor de texto a código Morse en Python

Vamos a implementar una función llamada Morse() de modo que cumpla con los siguientes requisitos:

Esta función se encargará de abrir un archivo existente, leer su contenido, traducirlo al código Morse y almacenar el resultado en un archivo nuevo que tenga el mismo nombre pero con la extensión *.mrs



Condiciones:
  • El archivo origen debe existir y debe tener la extensión *.txt.
  • Al ejecutar la función le pasaremos el nombre del archivo origen como parámetro.
  • La función creará el archivo nuevo con la extensión *.mrs.
  • Los caracteres del código Morse serán líneas "-" y puntos ".".
  • Para poder diferenciar unas letras de otras se añadirán espacios en blanco después de cada código.
  • Junto los caracteres del código Morse se almacenará la información necesaria para identificar las letras mayúsculas.
  • Se deben respetar los espacios y los saltos de carro del archivo original.
F.2.1 Le debemos indicar el nombre del archivo por parámetro.

Propuesta:

 En la Figura 2.2 puede apreciar la propuesta realizada para cumplir con las condiciones establecidas en el enunciado.



F.2.2 Primera propuesta del código del programa.

Para que a la hora de volver a pasar de Morse a texto normal no tengamos problemas entre los guiones "-" que puedan existir en la carta original y los creados por la función Morse(), he codificado el guión como una sucesión de 10 guiones en Morse.

Descripción línea a línea de la primera propuesta:
  1. Definimos la función e indicamos que habrá una parámetro de entrada.
  2. Si el nombre del archivo no termina en .txt ...
  3.    ... le añadimos la extensión al nombre que nos han pasado por parámetro.
  4. Abrimos el archivo en modo lectura y lo asignamos a la variable origen.
  5. Calculamos la distancia a la que se encuentra el punto en el nombre del archivo, ya necesitamos el mismo nombre para el archivo de salida.
  6. Empezamos a construir el nombre del fichero que vamos a generar para almacenar el código Morse. sólo copiamos el nombre sin la extensión.
  7. Le añadimos la extensión .mrs al nombre del archivo de salida.
  8. Abrimos el archivo de salida en modo escritura "a". Si no existe crea un archivo nuevo, pero si ya existe un archivo con dicho nombre, lo edita y sigue escribiendo al final del mismo.
  9. Creamos un diccionario llamado nm donde le añadimos las claves y los valores correspondientes al código Morse.
  10. Para cada linea extraída del archivo de lectura ...
  11. ... vaciamos la línea de salida. esta variable la vamos a utilizar para ir almacenando los caracteres hasta que se complete una línea. al empezar una línea nueva vaciamos su contenido.
  12. Para cada letra de la línea
  13. Si la letra está en el diccionario...
  14.     ... añadimos a la variable línea lo que ya tiene, más el equivalente de la letra en morse y un espacio en blanco. (Este espacio en blanco es para poder separar los puntos y las rallas pertenecientes a las distintas letras).
  15. Si no está en el diccionario miramos si está en el diccionario la misma letra pero en minúsculas.
  16. Si se trata de una letra en mayúsculas, en la línea de salida añadimos lo que  ya hay más el identificador que hemos creado para avisar que la siguiente letra tiene que ir en mayúsculas, más el equivalente en morse de la letra en minúsculas, más el espacio en blanco para diferenciar de las próximas letras.
  17. Si la letra no esta en el diccionario ...
  18. ... la añadimos tal y como está en la linea de salida.
  19. Una vez tenemos la línea entera la escribimos en el archivo de salida. Si siguen habiendo más lineas en el archivo de lectura cogemos la siguiente y saltamos al paso #11.
  20. Una vez se ha leido y escrito todo cerramos el archivo de lectura.
  21. Cerramos el archivo de escritura.
Código python para copiar:
Para poder probar y modificar lo explicado en estas líneas he añadido el código en Python. Recuerde que los espacios y las tabulaciones son importantes para conocer cuando termina un bucle if o un bucle for.

#!/usr/bin/env python

def Morse(nombre):                #1
    if not(nombre.endswith(".txt")):    #2
        nombre = nombre+".txt"        #3
    origen=open(nombre,"r")            #4
    pospunto = nombre.find('.')        #5
    nombresalida = nombre[:pospunto]    #6
    nombresalida = nombresalida+'.mrs'    #7
    destino = open(nombresalida,"a")    #8
    nm = {'a': '.-','b': '-...','c': '-.-.','d': '-..','e': '.','f': '..-.',
        'g': '--.','h': '....','i': '..','j': '.---','k': '-.-','l': '.-..',
        'm': '--','n': '-.','o': '---','p': '.--.','q': '--.-','r': '.-.',
        's': '...','t': '-','u': '..-','v': '...-','w': '.--','x': '-..-',
        'y': '-.--','z': '--..','0': '-----','1': '.----','2': '..---','3': '...--',
        '4': '....-','5': '.....','6': '-....','7': '--...','8': '---..','9': '----.',
        '.': '.-.-.-',',': '--..--','?': '..--..','\"': '.-..-.','-': '----------',}        #9


    for linea in origen.readlines():    #10
        lineasalida = ''        #11
        for i in linea:            #12
            if nm.has_key(i):    #13
                lineasalida = lineasalida+nm[i]+" "    #14
            elif nm.has_key(i.lower()):        #15
                lineasalida = lineasalida+"mayu"+nm[i.lower()]+" " #16
            else:                            #17
                lineasalida = lineasalida + i    #18
        destino.write(lineasalida)    #19
    origen.close()                #20
    destino.close()                #21


Muestra: 
Para poder probar el correcto funcionamiento del programa he introducido el siguiente texto:

 El clima de nuestro planeta está sufriendo importantes alteraciones desde hace varias décadas, principalmente a consecuencia de la emisión de gases que potencian el efecto invernadero (GEI) , originados por el uso extendido de combustibles fósiles, como el petróleo, el gas o el carbón-, la descomposición de residuos urbanos o ganaderos y los cambios en el uso de la tierra.

Existen ya pruebas irrefutables de este cambio. La temperatura de la atmósfera a nivel superficial ha sufrido un calentamiento progresivo desde el comienzo de la era industrial hasta nuestros días de 0,6º C de media, registrándose un aumento mayor en algunas zonas como los polos o el arco mediterráneo.

Los años más cálidos de los que se tiene registro se han producido a partir de 1990, así como cambios estacionales importantes, derretimiento de superficies heladas, subida del nivel de los océanos, cambios en los flujos de circulación general de las corrientes marinas.

...

Y esta es el resultado de la conversión realizada por nuestra aplicación objeto de estudio:

mayu. .-..  -.-. .-.. .. -- .-  -.. .  -. ..- . ... - .-. ---  .--. .-.. .- -. . - .-  . ... - á ... ..- ..-. .-. .. . -. -.. ---  .. -- .--. --- .-. - .- -. - . ...  .- .-.. - . .-. .- -.-. .. --- -. . ...  -.. . ... -.. .  .... .- -.-. .  ...- .- .-. .. .- ...  -.. é-.-. .- -.. .- ... --..--  .--. .-. .. -. -.-. .. .--. .- .-.. -- . -. - .  .-  -.-. --- -. ... . -.-. ..- . -. -.-. .. .-  -.. .  .-.. .-  . -- .. ... .. ó-.  -.. .  --. .- ... . ...  --.- ..- .  .--. --- - . -. -.-. .. .- -.  . .-..  . ..-. . -.-. - ---  .. -. ...- . .-. -. .- -.. . .-. ---  (mayu--. mayu. mayu.. ) --..--  --- .-. .. --. .. -. .- -.. --- ...  .--. --- .-.  . .-..  ..- ... ---  . -..- - . -. -.. .. -.. ---  -.. .  -.-. --- -- -... ..- ... - .. -... .-.. . ...  ..-. ó... .. .-.. . ... --..--  -.-. --- -- ---  . .-..  .--. . - .-. ó.-.. . --- --..--  . .-..  --. .- ...  ---  . .-..  -.-. .- .-. -... ó-. ---..--  .-.. .-  -.. . ... -.-. --- -- .--. --- ... .. -.-. .. ó-.  -.. .  .-. . ... .. -.. ..- --- ...  ..- .-. -... .- -. --- ...  ---  --. .- -. .- -.. . .-. --- ...  -.--  .-.. --- ...  -.-. .- -- -... .. --- ...  . -.  . .-..  ..- ... ---  -.. .  .-.. .-  - .. . .-. .-. .- .-.-.-

mayu. -..- .. ... - . -.  -.-- .-  .--. .-. ..- . -... .- ...  .. .-. .-. . ..-. ..- - .- -... .-.. . ...  -.. .  . ... - .  -.-. .- -- -... .. --- .-.-.-  mayu.-.. .-  - . -- .--. . .-. .- - ..- .-. .-  -.. .  .-.. .-  .- - -- ó... ..-. . .-. .-  .-  -. .. ...- . .-..  ... ..- .--. . .-. ..-. .. -.-. .. .- .-..  .... .-  ... ..- ..-. .-. .. -.. ---  ..- -.  -.-. .- .-.. . -. - .- -- .. . -. - ---  .--. .-. --- --. .-. . ... .. ...- ---  -.. . ... -.. .  . .-..  -.-. --- -- .. . -. --.. ---  -.. .  .-.. .-  . .-. .-  .. -. -.. ..- ... - .-. .. .- .-..  .... .- ... - .-  -. ..- . ... - .-. --- ...  -.. í.- ...  -.. .  ----- --..-- -.... º mayu-.-.  -.. .  -- . -.. .. .- --..--  .-. . --. .. ... - .-. á-. -.. --- ... .  ..- -.  .- ..- -- . -. - ---  -- .- -.-- --- .-.  . -.  .- .-.. --. ..- -. .- ...  --.. --- -. .- ...  -.-. --- -- ---  .-.. --- ...  .--. --- .-.. --- ...  ---  . .-..  .- .-. -.-. ---  -- . -.. .. - . .-. .-. á-. . --- .-.-.-

mayu.-.. --- ...  .- ñ--- ...  -- á...  -.-. á.-.. .. -.. --- ...  -.. .  .-.. --- ...  --.- ..- .  ... .  - .. . -. .  .-. . --. .. ... - .-. ---  ... .  .... .- -.  .--. .-. --- -.. ..- -.-. .. -.. ---  .-  .--. .- .-. - .. .-.  -.. .  .---- ----. ----. ----- --..--  .- ... í -.-. --- -- ---  -.-. .- -- -... .. --- ...  . ... - .- -.-. .. --- -. .- .-.. . ...  .. -- .--. --- .-. - .- -. - . ... --..--  -.. . .-. .-. . - .. -- .. . -. - ---  -.. .  ... ..- .--. . .-. ..-. .. -.-. .. . ...  .... . .-.. .- -.. .- ... --..--  ... ..- -... .. -.. .-  -.. . .-..  -. .. ...- . .-..  -.. .  .-.. --- ...  --- -.-. é.- -. --- ... --..--  -.-. .- -- -... .. --- ...  . -.  .-.. --- ...  ..-. .-.. ..- .--- --- ...  -.. .  -.-. .. .-. -.-. ..- .-.. .- -.-. .. ó-.  --. . -. . .-. .- .-..  -.. .  .-.. .- ...  -.-. --- .-. .-. .. . -. - . ...  -- .- .-. .. -. .- ... .-.-.-

.-.-.- .-.-.- .-.-.-

Futuras líneas de actuación:
Como se puede ver, la aplicación tiene problemas con los caracteres ascii extendidos, una futura línea de actuación podría ser la de corregir este problema.







No hay comentarios:

Publicar un comentario