• Domingo 21 de Julio de 2024, 08:49

Autor Tema:  Lectura De Archivos Planos  (Leído 5274 veces)

b.to

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Lectura De Archivos Planos
« en: Lunes 8 de Octubre de 2007, 17:34 »
0
Hola que tal:

Necesito ayuda con esto, soy un poco nuevo en Python y no se como hacerle:

El objetivo es estandarizar nombres de personas, es decir, si yo escribo "JOSE MA. TORRES HDZ", el programa me tiene que regresar: "JOSE MARIA TORRES HERNANDEZ".
Para esto, tengo un archivo de texto con varias abreviaciones y sus correspondientes palabras completas. En cuanto se lee el nombre de persona de entrada este se parte en palabras y cada una se busca en este archivo de texto a fin de encotnrar una abreviacion y su correspondiente palabra completa.
Este proceso ya lo tengo hecho y funciona correctamente.  :comp:
El problema viene cuando trato de leer muchos nombres a la vez desde una Base de Datos o cualquier otra fuente, ya que para cada nombre de persona que capturo, mi proceso lee el archivo de texto con las abreviaciones y esto hace que el tiempo de ejecución sea muuuuy largo.
¿Existe alguna forma de que al momento de ejecutar Python, este cargue una variable que pueda usar para cualquier programa?¿Hay alguna forma de que mi programa solo lea el archivo de texto una sola vez?

Espero que me puedan aconsejar  :ph34r:

Saludos

b.To  :devil:

NRM

  • Miembro MUY activo
  • ***
  • Mensajes: 279
  • Nacionalidad: ar
    • Ver Perfil
    • http://www.narrowmind.com.ar
Re: Lectura De Archivos Planos
« Respuesta #1 en: Martes 16 de Octubre de 2007, 05:57 »
0
Citar
¿Existe alguna forma de que al momento de ejecutar Python, este cargue una variable que pueda usar para cualquier programa?¿Hay alguna forma de que mi programa solo lea el archivo de texto una sola vez?

hola, bienvenido al foro.

si comprendí bien tu problema esta en que lees el archivo cada vez que necesitas remplazar una abreviación, de ser este el problema, yo te recomendaría que cargues el archivo en un set o diccionario con todos los valores de las abreviaciones(esto asumiendo que son del tipo key, value). después solo deberías usar ese diccionario que esta cargado en memoria.

espero que te sea útil y disculpa la tardanza de la respuesta.

b.to

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Lectura De Archivos Planos
« Respuesta #2 en: Martes 16 de Octubre de 2007, 15:29 »
0
Cita de: "NRM"
Citar
¿Existe alguna forma de que al momento de ejecutar Python, este cargue una variable que pueda usar para cualquier programa?¿Hay alguna forma de que mi programa solo lea el archivo de texto una sola vez?

hola, bienvenido al foro.
si comprendí bien tu problema esta en que lees el archivo cada vez que necesitas remplazar una abreviación, de ser este el problema, yo te recomendaría que cargues el archivo en un set o diccionario con todos los valores de las abreviaciones(esto asumiendo que son del tipo key, value). después solo deberías usar ese diccionario que esta cargado en memoria.
espero que te sea útil y disculpa la tardanza de la respuesta.
eey, gracias por tu respuesta.
Te comento que de hecho ya había pensado en utilizar un diccionario, el problema es que los dicconarios son en formato [key] --> [value] y en este caso la parte de [value] es de uno o más valores y también está el hecho de que estamos hablando de un diccionario que es de mas de un millón de registros. Podría usar una base de datos, pero no es posible  :(

jejeje
como ven? alguna idea?  :ph34r:

Saludotes

NRM

  • Miembro MUY activo
  • ***
  • Mensajes: 279
  • Nacionalidad: ar
    • Ver Perfil
    • http://www.narrowmind.com.ar
Re: Lectura De Archivos Planos
« Respuesta #3 en: Miércoles 17 de Octubre de 2007, 02:03 »
0
Cita de: "b.to"
eey, gracias por tu respuesta.
Te comento que de hecho ya había pensado en utilizar un diccionario, el problema es que los dicconarios son en formato [key] --> [value] y en este caso la parte de [value] es de uno o más valores y también está el hecho de que estamos hablando de un diccionario que es de mas de un millón de registros. Podría usar una base de datos, pero no es posible  :(

jejeje
como ven? alguna idea?  :ph34r:

Saludotes

Podrías poner algunos datos de ejemplo para tener una mejor idea?
Estas usando Python 2.5?

nrm

b.to

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Lectura De Archivos Planos
« Respuesta #4 en: Domingo 28 de Octubre de 2007, 22:54 »
0
Cita de: "NRM"
Cita de: "b.to"
eey, gracias por tu respuesta.
Te comento que de hecho ya había pensado en utilizar un diccionario, el problema es que los dicconarios son en formato [key] --> [value] y en este caso la parte de [value] es de uno o más valores y también está el hecho de que estamos hablando de un diccionario que es de mas de un millón de registros. Podría usar una base de datos, pero no es posible  :(

jejeje
como ven? alguna idea?  :ph34r:

Saludotes

Podrías poner algunos datos de ejemplo para tener una mejor idea?
Estas usando Python 2.5?

nrm
claro!

Un ejemplo sería lo siguiente:

Como entrada de datos tengo una lista de nombres:
"VICTOR FCO. TORRES HDZ"
"MA. DEL CARMEN TORRES HNDZ"
"JOSE LUIS TORRES HRNDEZ."

Por otro lado, tengo un archivo plano (de 450 mil linead) en el que tengo una lista en la que el pirimer valor en de cada linea corresponde a un texto estandarizado al que corresponden el resto de los valores en esa misma linea, algo como lo siguiente:
"HERNANDEZ, HDZ. HDZ, HNDZ, HRDEZ, HRNDEZ"
"MARIA, MA., MA"
"FRANCISCO, FCO., FRCISCO,"

En la primera linea el primer valor HERNANDEZ corresponde a el valor estandarizado de HDZ.,HRDEZ, etc etc.

El chiste de mi proceso es que, con la lista que tengo de entrada, descompongo cada cadena en palabras, cada una de estas palabras se busca en el archivo plano en donde al encontrarse, esta se sustituye por la palabra de la primera linea, es decir: hacemos esto:

1. Tengo esta cadena de entrada: "VICTOR FCO. TORRES HDZ"
2. La descompongo en palabras individuales (tokens): "VICTOR","FCO.","TORRES","HDZ"
3. Cada palabra o token se busca en la lista del archivo plano a fin de encontrar su equivalente, en este caso encontraremos que "FCO." corresponde a "FRANCISCO" y que "HDZ" corresponde a "HERNANDEZ".
4. Finalmente, mi dato de salida sería el siguiente: "VICTOR FRANCISCO TORRES HERNANDEZ"

Este proceso se repite por cada entrada.

Mi problema aqui es que por cada linea de entrada, mi proceso lee una y otra vez el archivo plano y lo que trato de hacer es que de alguna forma al momento de cargar Python, se ejecute un proceso para leer el archivo plano una sola vez y el resultado se guarde en alguna variable de memoria que sea accesible desde cualquier otro programa, algo asi como variable global- :blink:

jeje, espero se haya entendido, y gracias por sus comentarios.

p.D. uso Python 2.3

b.To  :hola:

NRM

  • Miembro MUY activo
  • ***
  • Mensajes: 279
  • Nacionalidad: ar
    • Ver Perfil
    • http://www.narrowmind.com.ar
Re: Lectura De Archivos Planos
« Respuesta #5 en: Miércoles 31 de Octubre de 2007, 01:56 »
0
el programa procesa un entrada de datos a la vez?
existe la posibilidad de que te pases a Python 2.5?

nrm

b.to

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Lectura De Archivos Planos
« Respuesta #6 en: Miércoles 31 de Octubre de 2007, 20:04 »
0
Cita de: "NRM"
el programa procesa un entrada de datos a la vez?
existe la posibilidad de que te pases a Python 2.5?

nrm
Así es, mi programa obtiene de una base de datos las entradas y procesa cada registro a la vez.
Por cada registro que se lee, el programa lee toodo el archivo plano donde están las sustituciones, por lo que para procesar todos los registros de la base de datos (cerca de 2 millones y contando) se tarda muchot tiempo.  :comp:

Ah! si puedo cambiar a Python 2.5

 :D

NRM

  • Miembro MUY activo
  • ***
  • Mensajes: 279
  • Nacionalidad: ar
    • Ver Perfil
    • http://www.narrowmind.com.ar
Re: Lectura De Archivos Planos
« Respuesta #7 en: Jueves 1 de Noviembre de 2007, 05:47 »
0
Python 2.5 trae soporte para Sqlite dentro de su librería estándar. Creo que esto solucionaría tu problema.

Aca te paso algunos links que te pueden ayudar:
http://docs.python.org/lib/module-sqlite3.html
http://www.netadmintools.com/art572.html

Saludos

nrm

joacoRamone

  • Nuevo Miembro
  • *
  • Mensajes: 18
    • Ver Perfil
Re: Lectura De Archivos Planos
« Respuesta #8 en: Domingo 18 de Noviembre de 2007, 23:49 »
0
Hola, fijate si esto te ayuda un poco.


Código: Text
  1. import sys
  2.  
  3. def leer_archivo():
  4.     try:
  5.         arch = open("/home/joaco/programacion/linux/palabras.txt")
  6.     except IOError:
  7.         print "Archivo no encontrado."
  8.         sys.exit(1)
  9.  
  10.     # inicializamos el diccionario
  11.     correspondencias = {}
  12.     # una de las tantas maneras de crear un diccionario
  13.     correspondencias=dict([(linea[:-1].split()[0], linea[:-1].split()[1:len(linea)])
  14.                         for linea in arch.readlines()])
  15.  
  16.     return correspondencias
  17.  
  18. if __name__ == "__main__":
  19.     d = leer_archivo()
  20.     for val, abr in d.iteritems():
  21.         if sys.argv[1] in abr:
  22.             print val
  23.  

No lo probe con un archivo grande, si queres pasame el tuyo y lo pruebo.

Saludos.
"Me gusta tanto la noche que al día le pondría un toldo"

NRM

  • Miembro MUY activo
  • ***
  • Mensajes: 279
  • Nacionalidad: ar
    • Ver Perfil
    • http://www.narrowmind.com.ar
Re: Lectura De Archivos Planos
« Respuesta #9 en: Martes 20 de Noviembre de 2007, 04:50 »
0
Cita de: "joacoRamone"
Hola, fijate si esto te ayuda un poco.


Código: Text
  1. import sys
  2.  
  3. def leer_archivo():
  4.     try:
  5.         arch = open("/home/joaco/programacion/linux/palabras.txt")
  6.     except IOError:
  7.         print "Archivo no encontrado."
  8.         sys.exit(1)
  9.  
  10.     # inicializamos el diccionario
  11.     correspondencias = {}
  12.     # una de las tantas maneras de crear un diccionario
  13.     correspondencias=dict([(linea[:-1].split()[0], linea[:-1].split()[1:len(linea)])
  14.                         for linea in arch.readlines()])
  15.  
  16.     return correspondencias
  17.  
  18. if __name__ == "__main__":
  19.     d = leer_archivo()
  20.     for val, abr in d.iteritems():
  21.         if sys.argv[1] in abr:
  22.             print val
  23.  

No lo probe con un archivo grande, si queres pasame el tuyo y lo pruebo.

Saludos.

Cita de: "b.to"
Por otro lado, tengo un archivo plano (de 450 mil linead) en el que tengo una lista en la que el pirimer valor en de cada linea corresponde a un texto estandarizado al que corresponden el resto de los valores en esa misma linea, algo como lo siguiente:
"HERNANDEZ, HDZ. HDZ, HNDZ, HRDEZ, HRNDEZ"
"MARIA, MA., MA"
"FRANCISCO, FCO., FRCISCO,"

generando datos random cercanos a las 475000 lineas y armando un diccionario con estos me consumio cerca de 124 megas de ram. no se si sea la mejor solucion :(

nrm