Je dois parcourir le .csv jusqu'à ce que le booléen appelé "seguir" devienne False. Le problème est que take while supprime la dernière itération et les dernières valeurs, et j'en ai besoin car les valeurs du .csv de cette ligne sont pertinentes pour mon problème.
for line in itertools.takewhile(lambda x: seguir, lectura):
data2 = strintodate(line[1])
data4 = strintodate(line[2])
if data2 < data4:
seguir = False
escritura.writerow([programa + 1, data2, data2, line[4]])
Des suggestions? Merci
4 Réponses :
Sans changer grand-chose, vous pourriez simplement conserver une variable temporaire en dehors de votre boucle for qui stocke la ligne précédente
prevLine = ""
for line in itertools.takewhile(lambda x: seguir, lectura):
<check that prevLine is not empty string as it will be on first iteration>
<do oepration involving prevLine>
data3 = strintodate(line[1])
data4 = strintodate(line[2])
if data2 < data4:
seguir = False
escritura.writerow([programa + 1, data2, data2, line[4]])
prevLine = line
Vous pouvez utiliser une boucle for avec une condition qui casser s après l'écriture de la ligne à la place:
for line in lectura:
data3 = strintodate(line[1])
data4 = strintodate(line[2])
escritura.writerow([programa + 1, data2, data2, line[4]])
if data2 < data4:
break
La solution de blhsing est la voie à suivre, mais il existe une autre façon de dépecer le chat - utilisez itertools. tee pour créer un itérateur qui suit de près
iter1, iter2 = tee(lectura)
for line in itertools.takewhile(lambda x: seguir, iter1):
next(iter2)
data3 = strintodate(line[1])
data4 = strintodate(line[2])
if data2 < data4:
seguir = False
escritura.writerow([programa + 1, data2, data2, line[4]])
line = next(iter2)
data3 = strintodate(line[1])
data4 = strintodate(line[2])
escritura.writerow([programa + 1, data2, data2, line[4]])
En un mot, moche. Un peu récupérable en extrayant le paramètre de data2 et d'autres éléments ainsi que l'appel à writerow dans une fonction distincte
Une autre solution plus élégante à ce problème est de changer le moment où
vous évaluez Le code devient comme ceci: data2 take while () , cela vous permettra d'inclure la "dernière" itération dans votre traitement. En d'autres termes, si vous avez 5 lignes avec data2 data2> = data4 , la boucle pour ci-dessous sera exécuter 6 fois, la dernière fois vous permettant de conserver les valeurs. data2, data4 = 2, 4
for line in itertools.takewhile(lambda x: data2 < data4, lectura):
data2 = strintodate(line[1])
data4 = strintodate(line[2])
escritura.writerow([programa + 1, data2, data2, line[4]])