Estoy tratando de recorrer un archivo y encontrar si existe una entrada. Necesito buscar a través de un rango de fechas y no estoy seguro de si primero recorrer las líneas del archivo y luego cada fecha, o recorrer las fechas y luego buscar en cada línea.

He probado ambas opciones, pero el siguiente código parece más "lógico". Mi pregunta es ¿cómo se razona esto como un programador? ¿Y por qué el siguiente código no prueba todos los single_date s, sino que solo itera una vez a través de todas las líneas del archivo.

with open(r'reportLog.txt','r') as logFile:
    for single_date in daterange(start_date, end_date):
        for line in logFile:
            if all(var in line for var in (reportName, str(single_date), 'R')):
                print('found')
                break
            else:
                print('not found')

ReportLog.txt:

Digital_Incomplete_Leads,2019-05-10,12:15:29,12:15:29,Y
Digital_Incomplete_Leads,2019-05-09,12:15:43,12:15:43,Y
Account Movement Report,2019-05-06,13:54:07,13:54:12,Y
Account Movement Report,2019-05-07,13:54:07,13:54:12,Y
Account Movement Report,2019-05-08,13:54:07,13:54:12,Y
Account Movement Report,2019-05-09,13:53:38,13:53:38,R
Account Movement Report,2019-05-09,13:54:07,13:54:12,Y

Quiero que el código se repita sobre el archivo de texto y salga cuando encuentre la siguiente línea:

Account Movement Report,2019-05-09,13:53:38,13:53:38,R
0
JMac 9 may. 2019 a las 16:21

3 respuestas

La mejor respuesta

Para la velocidad, el cuello de botella seguramente leerá el archivo, por lo que debería minimizarse.

Puede minimizar las lecturas de línea usando 'for line en logFile:' como el bucle externo.

0
ziggy jones 9 may. 2019 a las 13:26

Archivo:

Digital_Incomplete_Leads,2019-05-10,12:15:29,12:15:29,Y
Digital_Incomplete_Leads,2019-05-09,12:15:43,12:15:43,Y
Account Movement Report,2019-05-06,13:54:07,13:54:12,Y
Account Movement Report,2019-05-07,13:54:07,13:54:12,Y
Account Movement Report,2019-05-08,13:54:07,13:54:12,Y
Account Movement Report,2019-05-09,13:53:38,13:53:38,R
Account Movement Report,2019-05-09,13:54:07,13:54:12,Y

Código:

import csv
from datetime import datetime    

start_date = datetime.strptime("2019-05-06", "%Y-%m-%d")
end_date = datetime.strptime("2019-05-08", "%Y-%m-%d")
with open('main_data.csv') as f:
    csv_reader = csv.reader(f)
    for idx, line in enumerate(csv_reader):
        try:
            d = datetime.strptime(line[1], "%Y-%m-%d")
            if start_date <= d <= end_date:
                print(f"Found \"{line[1]}\" in {idx} row.")
                break
        except ValueError:
            print(f"Second column in {idx} row contain no date.")
        except IndexError:
            print(f"There's no second column in {idx} row.")
        except:
            print(f"Something unexpected in {idx} row.")
    else:
        print("Nothing have been found.")

Salida:

Found "2019-05-06" in 2 row.

Si desea utilizar daterange(), que es un método desconocido (para mí):

import csv


def daterange(start, end):
    # unknown method #
    pass


d_range = daterange("2019-05-06", "2019-05-08")
with open('main_data.csv') as f:
    csv_reader = csv.reader(f)
    for idx, line in enumerate(csv_reader):
        try:
            if line[1] in d_range:
                print(f"Found \"{line[1]}\" in {idx} row.")
                break
        except ValueError:
            print(f"Second column in {idx} row contain no date.")
        except IndexError:
            print(f"There's no second column in {idx} row.")
        except:
            print(f"Something unexpected in {idx} row.")
    else:
        print("Nothing have been found.")
0
Olvin Roght 9 may. 2019 a las 13:55

Acerca de qué bucle usar, la verdad es que generalmente hay más de una forma de resolver un problema, y casi todos los problemas de programación que necesitan usar un bucle podrían resolverse con más de un tipo de bucle. Dada la preocupación de la eficiencia, hay ventajas y desventajas para cada tipo. Este artículo te ayudará a decidir. https://www.harrisgeospatial.com/Learn/Blogs/Blog-Details/ArtMID/10198/ArticleID/15332/What-Type-of-Loop-Should-I-Use

0
sammy mutahi 9 may. 2019 a las 13:32