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]])