Soy nuevo aquí y actualmente estoy aprendiendo Python. Esta es mi primera publicación acá.
Estoy tratando de extraer un historial de chat enviado por un usuario en particular a través de un archivo .txt. por ejemplo, el número +99 9999 9999. Pero no puedo obtener el contenido intermedio.
02/09/2020, 23:45 - +99 9999 9999: 02/09/2020 task A -Changes A task b Changes b 03/09/2020, 01:55 - +88 8888 8888: 2-SEP-2020 task c -Changes c task d Changes d 03/09/2020, 01:55 - +99 9999 9999: 2-SEP-2020 task e -Changes e task f Changes fmi codigo actual es
number = "+99 9999 9999" with open('text.txt') as input_data: for line in input_data: if number in line: print(line)mi salida es el número con el contenido
02/09/2020, 23:45 - +99 9999 9999: 02/09/2020 03/09/2020, 01:55 - +99 9999 9999: 2-SEP-2020¿Cómo puedo editar mi código para mostrar las líneas posteriores si el número coincide con la fila? Cualquier orientación sería apreciada.
la salida que quiero
02/09/2020, 23:45 - +99 9999 9999: 02/09/2020 task A -Changes A task b Changes b 03/09/2020, 01:55 - +99 9999 9999: 2-SEP-2020 task e -Changes e task f Changes fNuevos datos
[23/9/20, 11:26:42 PM] John - Salesman: 23/09/2020 -task a -task b [23/9/20, 11:30:03 PM] Shawn - Support: 23/09/2020 -task c -task d [24/9/20, 9:54:44 PM]Shawn - Support: 24/09/2020 -task e -task f [24/9/20, 10:06:58 PM] Damien - Support: 24/09/2020 -task g -task h -task i -task j [24/9/20, 10:53:52 PM] John - Salesman: 24/09/2020 -task k -task l -task m -task nEsta será otra solución mía si su archivo de historial tiene más de 2 tareas para un solo número de teléfono.
Sintaxis de código
inp = input("please, Enter your input that you want to search for: ") def scanner (path, input): with open(path) as file: lines = file.readlines() for index, line in enumerate(lines): if line[0].isdigit() == True and line[20: -13] == input: print(line) lin = index+1 try: while lines[lin][0].isdigit() is False: print(lines[lin]) lin +=1 except IndexError: break print("="*40) print(f"*****History of {inp}*****") scanner(path, inp)Producción
please, Enter your input that you want to search for: +99 9999 9999 ======================================== *****History of +99 9999 9999***** 02/09/2020, 23:45 - +99 9999 9999: 02/09/2020 task A -Changes A task b Changes b 03/09/2020, 01:55 - +99 9999 9999: 2-SEP-2020 task e -Changes e task f Changes f [Program finished]Este está tan relacionado con el mismo lugar, la diferencia aquí estará en la operación de búsqueda extraída.
Sintaxis de código
def scanner2(path, input): with open(path) as file: lines = file.readlines() for index, line in enumerate(lines): if line[1].isdigit() == True and line[22: -13].strip(" ") == input: print(line) lin = index+1 try: while lines[lin][1].isdigit() is False: print(lines[lin]) lin +=1 except IndexError: break print("="*40) print(f"*****History of {inp}*****") scanner2(path2, inp)Salida ( la entrada distingue entre mayúsculas y minúsculas )
please, Enter your input that you want to search for: John - Salesman ======================================== *****History of John - Salesman***** [23/9/20, 11:26:42 PM] John - Salesman: 23/09/2020 -task a -task b [24/9/20, 10:53:52 PM] John - Salesman: 24/09/2020 -task k -task l -task m -task n [Program finished]import re with open('text.txt') as input_data: lines = input_data.readlines() re_number = re.compile("\+\d\d \d\d\d\d \d\d\d\d") number = "+99 9999 9999" blocks = [] tmp_block = [] for index, line in enumerate(lines): if (re_number.search(line)): if (tmp_block): blocks.append(tmp_block.copy()) tmp_block.clear() flag = 0 if (number in line): flag = 1 if (flag): tmp_block.append(line) if (flag): blocks.append(tmp_block.copy()) print (blocks)Solo verifica si tu número buscado está en la cadena
with open('text.txt') as input_data: lines = [i.rstrip('\n') for i in input_data.readlines()] blocks = [] number = "+99 9999 9999" while len(lines) != 0: if number in lines[0]: blocks.append(lines[:3]) lines = lines[3:]Aquí está tu respuesta:
number = "+99 9999 9999" with open('text.txt') as input_data: lines = input_data.readlines() # Instead of looping over the lines, we # loop over an array of integers starting # from zero and ending at the (number of # lines in the file minus 1). # (Remember,python lists are zero indexed, thats why) for line_no in range(len(lines)): if number in lines[line_no]: # The current line print(lines[line_no], end="") # Print the next line print(lines[line_no+1], end="") # And the next one too print(lines[line_no+2], end="")Debido a que su código solo encuentra la línea que contiene el número que desea, puede configurar una bandera para imprimir el siguiente contenido hasta otro número:
if __name__ == '__main__': number = "+99 9999 9999" task = 'task' wanted = False with open('text.txt') as input_data: for line in input_data: if number in line or wanted: wanted = True print(line.strip()) if line[:4] != task and number not in line: wanted = FalseTienes la parte de lectura del archivo resuelta. Necesita averiguar la declaración de impresión.
Aquí está el código para cuidarlo. Para simplificar, asigné todos los datos del archivo a una variable. También modifiqué los datos de entrada. El primer conjunto tiene 3 filas para +99 9999 9999
import re filedata = '''02/09/2020, 23:45 - +99 9999 9999: 02/09/2020 task A -Changes A task b Changes b task c Changes c 03/09/2020, 01:55 - +88 8888 8888: 2-SEP-2020 task c -Changes c task d Changes d 03/09/2020, 01:55 - +99 9999 9999: 2-SEP-2020 task e -Changes e task f Changes f''' number = '+99 9999 9999' for line in filedata.split('\n'): z = re.match(r"[+\d{2} \d{4} \d{4}]",line) if z: found = number in line if found: print (line)Explicación del código anterior:
Para cada línea leída, haga una coincidencia de reg ex para +nn nnnn nnnn donde n es cualquier dígito (d denota dígito). El resultado se envía a z.
Si z tiene algún valor, se encontró una coincidencia. Si encontramos una coincidencia, querrá averiguar si la línea es +99 9999 9999 o algún otro patrón numérico.
Si el patrón coincide, entonces configura la bandera para encontrar. Si se encuentra la bandera, imprima la línea. Continúe imprimiendo la línea hasta que se encuentre el siguiente conjunto de líneas +nn nnnn nnnn. Cuando lo encuentre, verifique si es +99 9999 9999. Si no lo es, cambie la bandera a Falso. La condición found = number in line da como resultado Verdadero o Falso. Cuando la bandera es Falsa, sabemos que ha comenzado un conjunto diferente. Deja de imprimir las líneas.
Espero que esto explique. Si todavía tiene preguntas sobre la lógica, hágamelo saber.
La salida de esto será:
02/09/2020, 23:45 - +99 9999 9999: 02/09/2020 task A -Changes A task b Changes b task c Changes c 03/09/2020, 01:55 - +99 9999 9999: 2-SEP-2020 task e -Changes e task f Changes fEsto funcionará independientemente de cuántas filas tenga entre +99 9999 9999 y el siguiente conjunto de +nn nnnn nnnn donde n puede ser cualquier dígito.
Aquí está el código que necesita con la lectura del archivo:
import re number = "+99 9999 9999" with open('text.txt') as input_data: for line in input_data: z = re.match(r"[+\d{2} \d{4} \d{4}]",line) if z: found = number in line if found: print (line)Estoy haciendo algunas conjeturas salvajes sobre lo que está tratando de hacer aquí.
Supongamos que desea encontrar John +99 9999 9999 como una cadena en el archivo e imprimir todas las líneas asociadas a esto. Entonces aquí está el código.
import re filedata = '''02/09/2020, 23:45 - John +99 9999 9999: 02/09/2020 task A -Changes A task b Changes b task c Changes c 03/09/2020, 01:55 - Suzan +88 8888 8888: 2-SEP-2020 task c -Changes c task d Changes d 03/09/2020, 01:55 - Thomas +99 9999 9999: 2-SEP-2020 task e -Changes e task f Changes f''' name = 'John' for line in filedata.split('\n'): z = re.findall(r"\w+ \+\d{2} \d{4} \d{4}",line) if z: found = (name in line) and (line[:4] != 'task') if found: print (line)La salida de esto será:
02/09/2020, 23:45 - John +99 9999 9999: 02/09/2020 task A -Changes A task b Changes b task c Changes cEsto funcionará para los siguientes patrones de código:
02/09/2020, 23:45 - John , Salesman +99 9999 9999: 02/09/2020 02/09/2020, 23:45 - John Salesman +99 9999 9999: 02/09/2020Déjame saber lo que estás tratando de encontrar. Con suerte, todos estos ejemplos deberían ayudarlo a obtener lo que está buscando.
Basado en los nuevos datos que compartió, aquí está el código:
filedata = """[23/9/20, 11:26:42 PM] John - Salesman: 23/09/2020 -task a -task b [23/9/20, 11:30:03 PM] Shawn - Support: 23/09/2020 -task c -task d [24/9/20, 9:54:44 PM]Shawn - Support: 24/09/2020 -task e -task f [24/9/20, 10:06:58 PM] Damien - Support: 24/09/2020 -task g -task h -task i -task j [24/9/20, 10:53:52 PM] John - Salesman: 24/09/2020 -task k -task l -task m -task n""" import re name = 'John - Salesman' for line in filedata.split('\n'): z = re.findall(r"([\w+ \- \w+:]*\d{2}\/\d{2}\/\d{4})",line) if z: found = (name in line) and (line[:4] != 'task') if found: print (line)La salida de esto será:
[23/9/20, 11:26:42 PM] John - Salesman: 23/09/2020 -task a -task b [24/9/20, 10:53:52 PM] John - Salesman: 24/09/2020 -task k -task l -task m -task nEn caso de que quiera jugar con la expresión regular, puede probarla aquí expresión regular
Prueba este código,
Sintaxis de código
path = 'extractiondata.txt' def scanner(path, input): with open(path) as file: lista = file.readlines() for index, each in enumerate(lista): if each[20:-13] == input: print(each) print(lista[index+1]) print(lista[index+2]) inp = input("please, Enter your input that you want to search for: ") scanner(path, inp)Producción
02/09/2020, 23:45 - +99 9999 9999: 02/09/2020 task A -Changes A task b Changes b 03/09/2020, 01:55 - +99 9999 9999: 2-SEP-2020 task e -Changes e task f Changes f