Python - Buscar una palabra de un archivo.txt

 
Vista:
sin imagen de perfil
Val: 17
Ha disminuido su posición en 6 puestos en Python (en relación al último mes)
Gráfica de Python

Buscar una palabra de un archivo.txt

Publicado por Pepe (12 intervenciones) el 02/06/2017 17:50:37
Hola gente.

Empece desde 0 con el python hace 3 semanas y sinceramente me estoy sorprendiendo de lo que pude aprender a programar hasta ahora.
Estoy armando un script que se conecta a un router cisco por ssh (modulo paramiko), y ejecuta un comando show que me arroja el siguiente resultado:

[' 30 second input rate 4000 bits/sec, 4 packets/sec\r\n']

A su vez se genera un archivo txt y se guarda en la carpeta donde esta instalado el python. Hasta aquí todo perfecto.

Lo que estoy necesitando hacer es abrir ese archivo nuevamente, y que solo quede : 4000 bits/sec para poder aplicar luego un if y hacer algo posteriormente.

¿alguien sabe como puedo manipular ese txt para que cuando lo abro , una vez generado, me muestre solamente: 4000 bits/sec.. osea.. que muestre una parte determinada de toda la linea. Es decir.. de un renglón que me muestre solo determinadas palabras y/o nros...

mucha gracias al que pueda ayudarme.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Buscar una palabra de un archivo.txt

Publicado por CpA (33 intervenciones) el 02/06/2017 18:54:35
Lo más fácil que se me ocurre es usar expresiones regulares...

En el siguiente ejemplo, recorro todo el fichero y por cada línea proceso una expresión regular con la máscara de tu ejemplo. Si la encuentro, en el caso del ejemplo, la imprimo, pero tu podrías hacer lo que quisieras con ella...

1
2
3
4
5
6
import re
with open("fichero.txt","r") as f:
    for l in f:
        m = re.match(r".*second input rate (.*\sbits\/sec).*",l)
        if m:
            print(m.group(1))

He usado el siguiente fichero de ejemplo:
fichero.txt
[' 30 second input rate 1000 bits/sec, 4 packets/sec\r\n']
[' 300 second input rate 20 bits/sec, 4 packets/sec\r\n']
[' 3 second input rate 300 bits/sec, 4 packets/sec\r\n']
[' 33333 second input rate 4 bits/sec, 4 packets/sec\r\n']
[' 4444 second input rate 512344559 bits/sec, 4 packets/sec\r\n']

Y he obtenido como resultado:
1000 bits/sec
20 bits/sec
300 bits/sec
4 bits/sec
512344559 bits/sec

Espero que fuera lo que necesitabas...

Si sólo quisieras los números, sería tan fácil como cambiar la línea de la expresión regular por:
m = re.match(r".*second input rate ([0-9]*)\sbits/sec.*",l)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 17
Ha disminuido su posición en 6 puestos en Python (en relación al último mes)
Gráfica de Python

Buscar una palabra de un archivo.txt

Publicado por Pepe (12 intervenciones) el 02/06/2017 19:11:00
Muchísimas Gracias amigo por la ayuda. lo voy a probar.

un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 17
Ha disminuido su posición en 6 puestos en Python (en relación al último mes)
Gráfica de Python

Buscar una palabra de un archivo.txt

Publicado por Pepe (12 intervenciones) el 02/06/2017 19:33:53
Amigo, te vuelvo a consultar sobre lo mismo.
¿como puedo extraer los nros si el el contenido del archivo txt esta como el que adjunto?
gracias nuevamente!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip
Val: 1.120
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Buscar una palabra de un archivo.txt

Publicado por kip (257 intervenciones) el 02/06/2017 20:09:57
Hola, segun veo el archivo no tiene saltos de linea no?, creo que esto servira:

1
2
3
4
5
6
7
8
9
import re
 
with open('file.txt','r') as f:
    texto = f.read()
 
matches = re.findall(r'(\d+)(?:\sbits/sec)', texto)
 
for match_num in matches:
    print('Numero -> %s' % match_num)

Haz la prueba.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Buscar una palabra de un archivo.txt

Publicado por CpA (33 intervenciones) el 02/06/2017 21:03:18
Si eres tu el que crea el fichero, añade un retorno de carro a la hora de guardarlo. Como te crezca mucho el fichero, podrías tener problemas de rendimiento e, incluso de desbordamiento...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip
Val: 1.120
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Buscar una palabra de un archivo.txt

Publicado por kip (257 intervenciones) el 02/06/2017 22:33:15
No existe problema si almacena un fichero de una sola linea, mas que de legibilidad y facilidad de manejar estos datos (no rendimiento), si tiene un salto de linea en cada frase o parrafo va a ser igual ya que seria un simple caracter mas, si usas un metodo como .read() la diferencia seria la interpretacion del caracter (\n) con otras funciones como por ejemplo .readlines() ya que esta ultima te devolvera una lista de n elementos por cada salto de linea, en ambos casos dependera de la memoria y capacidad de tu maquina el tamaño que estas puedan tener.......

Puedes tener un string de 100000000 caracteres o una lista de 200 elementos y cada uno de estos podrian ser un string de 500000 caracteres...... o puedes evaluar el mismo string o iterar sobre la lista y evaluar (esto tiene mas carga en memoria) en cualquier caso si tu maquina no tiene lo suficiente, no soportara ninguna opcion, ni el string ni la lista (es un caso hipotético el ejemplo que doy).

Es verdad que tener un mejor orden del contenido podria facilitar las cosas pero no tiene nada que ver con el rendimiento, ni desbordamiento...... tiene mas que ver en la logica, manejo de estos datos y facilidad en llegar a resolver el o los problemas que puedan dar en el proceso o solucion de cierta tarea.

La carga sobre la memoria de iterar y buscar en una lista u objeto (en el caso del archivo file), que ademas debe implementar una función que interprete el salto de linea es en cierto modo mayor que buscar sobre un string.....

Veamos una simulacion usando la libreria timeit para evaluar un simple MATCH in string y ver la velocidad sobre interpertar un \n, obtener una lista e iterar sobre esta o usar el string directamente:

1
2
3
4
5
6
7
8
import timeit
 
data = 'asdasdasMATCHsda\nasdasdasdasd\nasdasdasdasd\nasdasdasdasd'
 
timeList = timeit.timeit(stmt='["MATCH" in x for x in a.split("\\n")]', setup='a = """%s"""' % data)
timeString = timeit.timeit(stmt='"MATCH" in a', setup='a = """%s"""' % data)
 
print 'List -> %s secs\nString -> %s secs' % (timeList, timeString)

1
2
List -> 0.67791891098 secs
String -> 0.0429220199585 secs

Es solo un ejemplo, la velocidad y carga siempre se ven reflejadas por el algoritmo que se emplea y en el diseño de este, aun teniendo el mismo tamaño de variables en todas las posibles soluciones, aunque en ciertas ocasiones es posible que se deban usar metodos exactos por mucha carga que estos lleven en lugar de otros mas rapidos.... todo depende del problema...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 17
Ha disminuido su posición en 6 puestos en Python (en relación al último mes)
Gráfica de Python

Buscar una palabra de un archivo.txt

Publicado por Pepe (12 intervenciones) el 02/06/2017 22:44:56
EXCELENTE!!
Una ultima pregunta amigo.

Si quiero que esa lista de Nros me la sume y la divida por la cantidad que figuran (osea promedio), y el resultado lo imprima en una variable en Kbps (es decir , que lo divida por 1000 ya que esos valores estan en bits/seg.. como haria todo eso???
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip
Val: 1.120
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Buscar una palabra de un archivo.txt

Publicado por kip (257 intervenciones) el 02/06/2017 23:08:48
Puedes usar reduce() para obtener la suma de la lista, luego dividir esto para el valor que te retorne len() aplicado sobre esta misma lista y al final dividirlo por 1000.

Quizas algo asi:

1
2
3
4
5
6
7
8
9
10
import re
 
with open('file.txt','r') as f:
    texto = f.read()
 
matches = re.findall(r'(\d+)(?:\sbits/sec)', texto)
 
prom = (reduce(lambda x, y: float(x) + float(y), matches) / len(matches)) / 1000
 
print('%.2f Kbps' % prom)

Intenta aplicarlo en tu codigo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 17
Ha disminuido su posición en 6 puestos en Python (en relación al último mes)
Gráfica de Python

Buscar una palabra de un archivo.txt

Publicado por Pepe (12 intervenciones) el 03/06/2017 01:39:20
Amigo,
Cuando ejecuto el script ultimo que me pasaste me dice :
"name reduce is not definied"

soy novato con el python perdon tantas preguntas.

mil gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip
Val: 1.120
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Buscar una palabra de un archivo.txt

Publicado por kip (257 intervenciones) el 03/06/2017 01:44:11
Olvide que en Python 3 debes usar la el metodo reduce() del modulo functools, asi:

1
from functools import reduce

Eso iria al inicio del script:

1
2
3
4
5
6
7
8
9
10
11
from functools import reduce
import re
 
with open('file.txt','r') as f:
    texto = f.read()
 
matches = re.findall(r'(\d+)(?:\sbits/sec)', texto)
 
prom = (reduce(lambda x, y: float(x) + float(y), matches) / len(matches)) / 1000
 
print('%.2f Kbps' % prom)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 17
Ha disminuido su posición en 6 puestos en Python (en relación al último mes)
Gráfica de Python

Buscar una palabra de un archivo.txt

Publicado por Pepe (12 intervenciones) el 03/06/2017 02:06:18
Ahora si!
Veo que tienes mucha experiencia con python.
te estoy super agradecido amigo.

Conoces algun tutorial de python3.6.1 que arranque desde cero?

seguimos en contacto!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Buscar una palabra de un archivo.txt

Publicado por Dave (6 intervenciones) el 20/02/2018 22:41:06
Hola, este es el error que me arroja y no imprime nada

1
2
3
4
Traceback (most recent call last):
  File "regshot-filter.py", line 457, in <module>
    prom = (reduce(lambda x, y: float(x) + float(y), matches) / len(matches)) / 1000
TypeError: reduce() of empty sequence with no initial value

gracias por tu ayuda ..
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Buscar una palabra de un archivo.txt

Publicado por Dave (6 intervenciones) el 20/02/2018 22:24:53
Hola, creo que esto es lo que estaba buscando... pero no me funciona :( tengo N cantidad de lineas como esta:
1
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\6770B6A8007FBD144AF33701EA7AE156\InstallProperties\HelpLink: "http://www.interlinkelec.com"

y lo que quiero es mostrar en pantalla todas las URLs encontradas con python

ya lo probe pero no me imprime ningun resultado

gracias por la atencion
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Buscar una palabra de un archivo.txt

Publicado por ricardo (1 intervención) el 23/05/2018 22:21:17
Buen dia,

tengo un archivo txt, dentro del mismo necesito sacar el texto que sigue luego de usuario: pepito. y que me lo asigne a una Variable.
o sea necesito que me asigne pepito a una variable.
el texto tiene saltos.
Desde ya muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar