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
3 respuestas
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.
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.")
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
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.