TODOPIC

Lenguajes de programación para PC => Python => Mensaje iniciado por: Daniel1952 en 19 de Octubre de 2021, 10:24:12

Título: Expresiones regulares, buscar en un archivo de texto.
Publicado por: Daniel1952 en 19 de Octubre de 2021, 10:24:12
Hola gente, ¿como están?, les deseo a todos un bello bello Martes.-
Me metí de lleno a aprender expresiones regulares y bueno las cosas mas sencillas la estoy logrando pero en esto me trabe y x mas que lo charlo a Google no me da la respuesta.-
Esto es lo que contiene mi base de datos(archivo.txt) lo que deseo aprender es como buscar x uno de los 3 campos(de ser posible el campo: descripción del producto) y poner en la lista toda la línea(código, descripción y precio).-
Bueno es todo, a continuación dejo lo que llevo hecho y el archivo.-
Desde ya gracias y slds. Daniel.

0001 - Tomate perita Arcor $ 75.90
0002 - Ensalada de frutas La Emilia $ 175.90
0003 - Extracto de tomate Arcor $ 95.20
0004 - Pimientos morrones lata x 200 grs. Arcor $ 105.20
0005 - Sal fina Celusal pte. x 500 grs. $ 50.50
0006 - Galletitas Surtido de Bagley x 390 grs. $ 125.00
0007 - Galletitas Granis con semamo x 290 grs. $ 70.00
0008 - Sal parrillera 2 anclas x 500 grs. $79.90
0009 - Extracto de tomate Macari $ 82.20
0010 - Tomate perita Molto $ 65.90
0011 - Mayonesa Hellman´s x 250 grs. $ 99.00
0012 - Durazno al natural Molto x 850 grs. $ 179.50
0013 - Mayonesa Natura x 250 grs. $ 105.90
0014 - Pimientos morrones lata x 200 grs. Molto $ 95.00
0015 - Durazno al natural Arcor x 850 grs. $ 200.50
0016 - Fideos Terrabussi soperos x 500 grs. $ 89.50

Código: Python
  1. import re
  2. archivo = open("prueba_ER.txt", "r")
  3. texto = archivo.read()
  4. archivo.close()
  5.  
  6. buscar = "tomate"
  7. resultado = []
  8.  
  9. for item in re.findall("tomate.+", texto):
  10.     resultado.append(item)
  11.    
  12.    
  13. print(resultado)
Título: Re:Expresiones regulares, buscar en un archivo de texto.
Publicado por: Picuino en 19 de Octubre de 2021, 11:23:43
A ver si esto es lo que buscas:

Código: Python
  1. import re
  2.  
  3. texto = """0001 - Tomate perita Arcor $ 75.90
  4. 0002 - Ensalada de frutas La Emilia $ 175.90
  5. 0003 - Extracto de tomate Arcor $ 95.20
  6. 0004 - Pimientos morrones lata x 200 grs. Arcor $ 105.20
  7. 0005 - Sal fina Celusal pte. x 500 grs. $ 50.50
  8. 0006 - Galletitas Surtido de Bagley x 390 grs. $ 125.00
  9. 0007 - Galletitas Granis con semamo x 290 grs. $ 70.00
  10. 0008 - Sal parrillera 2 anclas x 500 grs. $79.90
  11. 0009 - Extracto de tomate Macari $ 82.20
  12. 0010 - Tomate perita Molto $ 65.90
  13. 0011 - Mayonesa Hellman´s x 250 grs. $ 99.00
  14. 0012 - Durazno al natural Molto x 850 grs. $ 179.50
  15. 0013 - Mayonesa Natura x 250 grs. $ 105.90
  16. 0014 - Pimientos morrones lata x 200 grs. Molto $ 95.00
  17. 0015 - Durazno al natural Arcor x 850 grs. $ 200.50
  18. 0016 - Fideos Terrabussi soperos x 500 grs. $ 89.50"""
  19.  
  20. lineas = texto.split('\n')
  21.  
  22. for linea in lineas:
  23.     if re.search('tomate', linea, re.IGNORECASE):
  24.         print(linea)

Salida:
Código: [Seleccionar]
0001 - Tomate perita Arcor $ 75.90
0003 - Extracto de tomate Arcor $ 95.20
0009 - Extracto de tomate Macari $ 82.20
0010 - Tomate perita Molto $ 65.90
Título: Re:Expresiones regulares, buscar en un archivo de texto.
Publicado por: Picuino en 19 de Octubre de 2021, 11:31:49
La lectura de una cadena de texto desde un archivo es mejor hacerla así:

Código: Python
  1. import codecs
  2.  
  3. with codecs.open('prueba_ER.txt', 'r', encoding='utf-8') as archivo:
  4.     texto = archivo.read()

De esa forma, al terminar de leer se cerrará el archivo (archivo.close()) que es lo que deberías haber añadido en tu programa, pero ya lo hace Python por ti con la sentencia with.

Por otro lado, con el módulo codecs, puedes leer archivos UTF-8 con tildes, eñes, etc y reconocer esos caracteres especiales sin problemas.

Título: Re:Expresiones regulares, buscar en un archivo de texto.
Publicado por: Daniel1952 en 19 de Octubre de 2021, 11:46:02
Luego lo charlamos, ahora me aboco a memorizar lo del código, gracias..

Traceback (most recent call last):
  File "C:\Users\Daniel\Mega\Mega\Python\Programas\ArchivoER.py", line 5, in <module>
    texto = archivo.read()
  File "C:\Users\Daniel\AppData\Local\Programs\Thonny\lib\codecs.py", line 701, in read
    return self.reader.read(size)
  File "C:\Users\Daniel\AppData\Local\Programs\Thonny\lib\codecs.py", line 504, in read
    newchars, decodedbytes = self.decode(data, self.errors)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb4 in position 494: invalid start byte
Título: Re:Expresiones regulares, buscar en un archivo de texto.
Publicado por: Picuino en 19 de Octubre de 2021, 11:52:15
Prueba esto para guardar el archivo de texto en formato UTF-8:

Código: Python
  1. import codecs
  2.  
  3. texto = """0001 - Tomate perita Arcor $ 75.90
  4. 0002 - Ensalada de frutas La Emilia $ 175.90
  5. 0003 - Extracto de tomate Arcor $ 95.20
  6. 0004 - Pimientos morrones lata x 200 grs. Arcor $ 105.20
  7. 0005 - Sal fina Celusal pte. x 500 grs. $ 50.50
  8. 0006 - Galletitas Surtido de Bagley x 390 grs. $ 125.00
  9. 0007 - Galletitas Granis con sésamo x 290 grs. $ 70.00
  10. 0008 - Sal parrillera 2 anclas x 500 grs. $79.90
  11. 0009 - Extracto de tomate Macari $ 82.20
  12. 0010 - Tomate perita Molto $ 65.90
  13. 0011 - Mayonesa Hellman´s x 250 grs. $ 99.00
  14. 0012 - Durazno al natural Molto x 850 grs. $ 179.50
  15. 0013 - Mayonesa Natura x 250 grs. $ 105.90
  16. 0014 - Pimientos morrones lata x 200 grs. Molto $ 95.00
  17. 0015 - Durazno al natural Arcor x 850 grs. $ 200.50
  18. 0016 - Fideos Terrabussi soperos x 500 grs. $ 89.50"""
  19.  
  20. with codecs.open('prueba_ER.txt', 'w', encoding='utf-8') as archivo:
  21.     archivo.write(texto)

Edito:
También puedes cambiar el formato a UTF-8 editando el ficheros de texto con Notepad++ y luego modificarlo en el menú Codificación.  https://notepad-plus-plus.org/
Es un editor de texto bastante bueno.

Un saludo.
Título: Re:Expresiones regulares, buscar en un archivo de texto.
Publicado por: Nocturno en 19 de Octubre de 2021, 14:20:47
Lo que voy a aprender de Python con vosotros  :-/ :-/ :-/
Título: Re:Expresiones regulares, buscar en un archivo de texto.
Publicado por: Daniel1952 en 19 de Octubre de 2021, 17:05:11
Muchas gracias Picuino todo funciona a la perfección, gracias.
Ahora tengo este inconveniente.

Código: Python
  1. print("\n ======= Resultado de la búsqueda =======")
  2. for linea in lineas:
  3.     if re.search("0004|0005|0006|0007|0008|0009", linea, re.IGNORECASE):
  4.         print(linea)
Debo suponer que tantos “or” pueden ser reemplazados x algo mas corto ¿estoy en lo cierto?, gracias.
Título: Re:Expresiones regulares, buscar en un archivo de texto.
Publicado por: Picuino en 19 de Octubre de 2021, 17:34:18
Lo primero que voy a quitar es la opción re.IGNORECASE, que significa que no distinga entre mayúsculas y minúsculas. En este caso, con números, no hace falta.

Después esos números se pueden resumir con un corchete:

Código: Python
  1. print("\n ======= Resultado de la búsqueda =======")
  2. for linea in lineas:
  3.     if re.search("000[4-9]", linea):
  4.         print(linea)


Edito:
conviene decirle que el número se encuentra al comienzo de la línea, con el caracter '^':

Código: Python
  1. print("\n ======= Resultado de la búsqueda =======")
  2. for linea in lineas:
  3.     if re.search("^000[4-9]", linea):
  4.         print(linea)

Título: Re:Expresiones regulares, buscar en un archivo de texto.
Publicado por: Picuino en 19 de Octubre de 2021, 17:36:43
Otra forma de hacerlo es traducir el índice a un número y manejarlo así:

Código: Python
  1. for linea in lineas:
  2.     indice = int(linea[:4])
  3.     if indice >= 4 and indice <= 9:
  4.         print(linea)

linea[:4] son los 4 primeros caracteres de la línea (los que corresponden a un número). Se puede hacer de otras formas, pero esta por ahora es sencilla.

Edito
Por ejemplo otra manera de cortar el índice sería:
 indice = int(linea.split('-')[0])
Título: Re:Expresiones regulares, buscar en un archivo de texto.
Publicado por: Daniel1952 en 19 de Octubre de 2021, 17:47:55
Ok Picuino  ((:-)) ((:-)) ((:-)), bueno esto me queda como tarea, hacer que el operario ingrese en la búsqueda “1004 1010” y pasarlo al formato que propusiste mediante programación.-
Ni bien lo logre pongo el código, saludos cordiales.-
Título: Re:Expresiones regulares, buscar en un archivo de texto.
Publicado por: Picuino en 19 de Octubre de 2021, 18:02:13
Ten en cuenta que traducir todo te va a costar mucho trabajo.
El operario eres tú. Si tu sabes cómo decirle a Python la manera de buscar algo, no te compliques más.

Si buscas un ejercicio interesante, yo he utilizado en ocasiones Python para extraer datos de un documento PDF.
Primero lo convierto a texto con estas herramientas (https://www.xpdfreader.com/) y luego lo proceso con Python.

Por ejemplo a mi me ha servido para traducir los datos de los registros de control de un PIC que aparecen en el datasheet, a un programa en C para manejarlos. Eso es demasiado complejo para ponerse ahora con ello, pero hacer búsquedas de texto sencillas en un PDF real puede ser interesante.

Saludos.
Título: Re:Expresiones regulares, buscar en un archivo de texto.
Publicado por: Daniel1952 en 19 de Octubre de 2021, 19:04:58
Citar
Ten en cuenta que traducir todo te va a costar mucho trabajo.
El operario eres tú. Si tu sabes cómo decirle a Python la manera de buscar algo, no te compliques más.
Que esclarecedora son estas palabras, pero quiero hacerlo para renegar un poco y renegar me va a ayudar a crecer.-
Este x el momento es mi criterio:
Si se ingresa un 1(código) lo completo con esto:buscar = buscar.zfill(4)
Si ingresa alguna letra la búsqueda se producirá en el campo descripción.
Si ingresa algún punto la búsqueda se producirá en el campo precio.-
Voy a seguir picando código, gracias x tu tiempo.- 
Título: Re:Expresiones regulares, buscar en un archivo de texto.
Publicado por: Nocturno en 20 de Octubre de 2021, 01:55:12
Ten en cuenta que traducir todo te va a costar mucho trabajo.
El operario eres tú. Si tu sabes cómo decirle a Python la manera de buscar algo, no te compliques más.

Si buscas un ejercicio interesante, yo he utilizado en ocasiones Python para extraer datos de un documento PDF.
Primero lo convierto a texto con estas herramientas (https://www.xpdfreader.com/) y luego lo proceso con Python.

Por ejemplo a mi me ha servido para traducir los datos de los registros de control de un PIC que aparecen en el datasheet, a un programa en C para manejarlos. Eso es demasiado complejo para ponerse ahora con ello, pero hacer búsquedas de texto sencillas en un PDF real puede ser interesante.

Saludos.
¡Qué buena idea!, no se me habría ocurrido hacerlo con Python, quizás con Excel, pero me lo apunto para cuando me haga falta.
Título: Re:Expresiones regulares, buscar en un archivo de texto.
Publicado por: Picuino en 20 de Octubre de 2021, 07:35:55
Con Python puedes formatear el texto plano que salga de un PDF para cambiarlo a formato CSV e importarlo luego en excel.

Por ejemplo con los datos de Daniel:

Código: Python
  1. import re
  2.  
  3. texto = """0001 - Tomate perita Arcor $ 75.90
  4. 0002 - Ensalada de frutas La Emilia $ 175.90
  5. 0003 - Extracto de tomate Arcor $ 95.20
  6. 0004 - Pimientos morrones lata x 200 grs. Arcor $ 105.20
  7. 0005 - Sal fina Celusal pte. x 500 grs. $ 50.50
  8. 0006 - Galletitas Surtido de Bagley x 390 grs. $ 125.00
  9. 0007 - Galletitas Granis con sésamo x 290 grs. $ 70.00
  10. 0008 - Sal parrillera 2 anclas x 500 grs. $79.90
  11. 0009 - Extracto de tomate Macari $ 82.20
  12. 0010 - Tomate perita Molto $ 65.90
  13. 0011 - Mayonesa Hellman´s x 250 grs. $ 99.00
  14. 0012 - Durazno al natural Molto x 850 grs. $ 179.50
  15. 0013 - Mayonesa Natura x 250 grs. $ 105.90
  16. 0014 - Pimientos morrones lata x 200 grs. Molto $ 95.00
  17. 0015 - Durazno al natural Arcor x 850 grs. $ 200.50
  18. 0016 - Fideos Terrabussi soperos x 500 grs. $ 89.50"""
  19.  
  20. lineas = texto.split('\n')
  21. for linea in lineas:
  22.     campos = re.split(' - | \$ ?', linea)
  23.     print('{},{},{}'.format(*campos))

La salida será un texto que sirve como documento csv:
Código: [Seleccionar]
0001,Tomate perita Arcor,75.90
0002,Ensalada de frutas La Emilia,175.90
0003,Extracto de tomate Arcor,95.20
0004,Pimientos morrones lata x 200 grs. Arcor,105.20
0005,Sal fina Celusal pte. x 500 grs.,50.50
0006,Galletitas Surtido de Bagley x 390 grs.,125.00
0007,Galletitas Granis con sésamo x 290 grs.,70.00
0008,Sal parrillera 2 anclas x 500 grs.,79.90
0009,Extracto de tomate Macari,82.20
0010,Tomate perita Molto,65.90
0011,Mayonesa Hellman´s x 250 grs.,99.00
0012,Durazno al natural Molto x 850 grs.,179.50
0013,Mayonesa Natura x 250 grs.,105.90
0014,Pimientos morrones lata x 200 grs. Molto,95.00
0015,Durazno al natural Arcor x 850 grs.,200.50
0016,Fideos Terrabussi soperos x 500 grs.,89.50

Y luego puedes hacer también labores de búsqueda y extracción directamente en excel.
Título: Re:Expresiones regulares, buscar en un archivo de texto.
Publicado por: Daniel1952 en 04 de Noviembre de 2021, 11:37:39
Hola gente, mi consulta esta vez es mas de criterio que de código, pongo a continuación lo que tengo en un archivo de texto y para mostrar x partes me imagine que la única manera era “codificandolo”, ¿es correcta esta manera o Uds. me proponen otra?
Bueno es todo, abrazo y desde ya gracias.

Citar
100 Vamos a comenzar con una breve discusión acerca de terminología.
100 En una lección previa, dependiendo del sistema operativo de tu
100 computadora: Mac, Windows, Linux, viste cómo se envía información
100 a la ventana de “comando de salida” en tu editor de texto mediante
100 la utilización del comando print de Python.

101 El lenguaje de programación Python es del tipo orientado a objetos.
101 Esto quiere decir que está construido alrededor de un tipo especial de
101 entidad, un objeto, que contiene a la vez datos así como una serie de
101 métodos para acceder y alterar los datos. Una vez que se crea un objeto
101 se puede interactuar con otros objetos.

102 En el ejemplo de arriba vimos un tipo de objeto, la cadena (string)
102 “Hola Mundo”. La cadena es la secuencia de una serie de caracteres
102 encerrados entre comillas. Puedes escribir una cadena de tres maneras distintas:

Código: Python
  1. import re
  2. import codecs
  3.  
  4. with codecs.open('Decretos.txt', 'r+', encoding='utf-8') as archivo:
  5.     linea = archivo.read()
  6.     lineas = linea.split('\n')
  7.    
  8.     buscar = input("\n Ingrese lo que desea buscar...: ")
  9.     print("\n============================================================")
  10.     for linea in lineas:
  11.         if re.search(buscar, linea, re.IGNORECASE):
  12.             print(linea[4:])
Título: Re:Expresiones regulares, buscar en un archivo de texto.
Publicado por: Picuino en 04 de Noviembre de 2021, 15:24:29
El with termina una vez leído el archivo:

Código: Python
  1. import re
  2. import codecs
  3.  
  4. with codecs.open('Decretos.txt', 'r+', encoding='utf-8') as archivo:
  5.     datos = archivo.read()
  6.  
  7. lineas = datos.split('\n')
  8.    
  9. buscar = input("\n Ingrese lo que desea buscar...: ")
  10. print("\n============================================================")
  11. for linea in lineas:
  12.     if re.search(buscar, linea, re.IGNORECASE):
  13.         print(linea[4:])
Título: Re:Expresiones regulares, buscar en un archivo de texto.
Publicado por: Daniel1952 en 04 de Noviembre de 2021, 16:01:13
Gracias, buen dato para un principiante.-
Título: Re:Expresiones regulares, buscar en un archivo de texto.
Publicado por: Picuino en 04 de Noviembre de 2021, 16:21:49
Otra forma de hacerlo es leyendo línea a línea el archivo.
Puede venir bien para archivos muy grandes que no quepan en la memoria.

Código: Python
  1. import re
  2. import codecs
  3.  
  4. buscar = input("\n Ingrese lo que desea buscar...: ")
  5. print("\n============================================================")
  6.  
  7. with codecs.open('Decretos.txt', 'r', encoding='utf-8') as archivo:
  8.     for linea in archivo:
  9.         if re.search(buscar, linea, re.IGNORECASE):
  10.             print(linea[4:].strip())

El strip() es para quitar el caracter de nueva línea '\n' que siempre hay al final.
Título: Re:Expresiones regulares, buscar en un archivo de texto.
Publicado por: Daniel1952 en 04 de Noviembre de 2021, 17:02:18
Por lo que pude notar con un print(al final) que lee lo necesario(según la búsqueda) y descarta el resto, ¿es así? Y otra pregunta, ¿de esta manera no estaría guardado el contenido(del archivo) en una lista, no seria reutilizable, me equivoco?.-
Lo que no me queda claro es si me vas entregando todo en cuotas o no entendiste mi consulta inicial, gracias Picuino.
Si ya esta todo te pido una última ayudita, ¿Cómo puedo hacer esto?

Código: Python
  1. ['100', [' Nadie te gritara si no le gritaste a nadie.', ‘Nadie te ofenderá si no ofendiste a nadie’]]
Título: Re:Expresiones regulares, buscar en un archivo de texto.
Publicado por: Picuino en 04 de Noviembre de 2021, 17:17:25
Hola Daniel.
No te equivocas. La lista no se guarda.
No entiendo la duda que tienes al final.
Título: Re:Expresiones regulares, buscar en un archivo de texto.
Publicado por: Daniel1952 en 04 de Noviembre de 2021, 17:40:09
Para no poner los 6 100 guardar lo encontrado en una lista de lista/multilista, ayer había encontrado como separar el texto en 2 listas y ahora no lo encuentro.-
Si no lo entendes no importa ya aparecera, despreocupate.-
Título: Re:Expresiones regulares, buscar en un archivo de texto.
Publicado por: Daniel1952 en 04 de Noviembre de 2021, 18:49:04
Esto es lo que buscaba:

Código: Python
  1. cadena = "Estamos explicando el funcionamiento de split en Python"
  2. separador = " "
  3. separaciones = 1
  4. separado = cadena.split(separador, separaciones)
  5. print("Separado por espacios es:", separado)

En el bucle for grabar en una lista ['100', 'aquí las 6 línear’], lo estoy intentando. ☕☕☕
Título: Re:Expresiones regulares, buscar en un archivo de texto.
Publicado por: Picuino en 05 de Noviembre de 2021, 06:11:19
Código: Python
  1. import re
  2.  
  3. texto = """100 Vamos a comenzar con una breve discusión acerca de terminología.
  4. 100 En una lección previa, dependiendo del sistema operativo de tu
  5. 100 computadora: Mac, Windows, Linux, viste cómo se envía información
  6. 100 a la ventana de “comando de salida” en tu editor de texto mediante
  7. 100 la utilización del comando print de Python.
  8.  
  9. 101 El lenguaje de programación Python es del tipo orientado a objetos.
  10. 101 Esto quiere decir que está construido alrededor de un tipo especial de
  11. 101 entidad, un objeto, que contiene a la vez datos así como una serie de
  12. 101 métodos para acceder y alterar los datos. Una vez que se crea un objeto
  13. 101 se puede interactuar con otros objetos.
  14.  
  15. 102 En el ejemplo de arriba vimos un tipo de objeto, la cadena (string)
  16. 102 “Hola Mundo”. La cadena es la secuencia de una serie de caracteres
  17. 102 encerrados entre comillas. Puedes escribir una cadena de tres maneras distintas:"""
  18.  
  19. lineas = texto.split('\n')
  20. database = {}
  21. for linea in lineas:
  22.     campos = re.split(' ', linea, maxsplit=1)
  23.     if len(campos) < 2:
  24.         continue
  25.     if not campos[0] in database:
  26.         database[campos[0]] = []
  27.     database[campos[0]].append(campos[1])
  28. print(database)

Salida:
Código: [Seleccionar]
{'100': ['Vamos a comenzar con una breve discusión acerca de terminología.',
 'En una lección previa, dependiendo del sistema operativo de tu',
 'computadora: Mac, Windows, Linux, viste cómo se envía información',
'a la ventana de “comando de salida” en tu editor de texto mediante',
 'la utilización del comando print de Python.'],
 '101': ['El lenguaje de programación Python es del tipo orientado a objetos.',
 'Esto quiere decir que está construido alrededor de un tipo especial de',
 'entidad, un objeto, que contiene a la vez datos así como una serie de',
'métodos para acceder y alterar los datos. Una vez que se crea un objeto',
'se puede interactuar con otros objetos.'],
'102': ['En el ejemplo de arriba vimos un tipo de objeto, la cadena (string)',
'“Hola Mundo”. La cadena es la secuencia de una serie de caracteres',
'encerrados entre comillas. Puedes escribir una cadena de tres maneras distintas:']}
Título: Re:Expresiones regulares, buscar en un archivo de texto.
Publicado por: Daniel1952 en 05 de Noviembre de 2021, 18:42:43
Hola Picuino ¿Cómo estas? despacito estoy digeriendo este código, desde ya gracias.-
A vos y el resto que te lean les deseo un bello bello fin de semana, no me extrañen.-
slds. Daniel
Título: Re:Expresiones regulares, buscar en un archivo de texto.
Publicado por: Picuino en 06 de Noviembre de 2021, 08:26:38
Igual con un lemario se te ocurren más programas interesantes.
El lemario es una lista con todas las palabras del castellano. Puedes buscar palabras que rimen, que falten en un crucigrama, etc.

https://github.com/olea/lemarios/blob/master/lemario-general-del-espanol.txt