@andie39: Mit der Endlosschleife hat hier keiner so wirklich gerechnet weil wir kaum Erfahrungen mit "r+" als Dateimodus haben, weil das keiner macht. Das produziert hier natürlich tatsächlich eine Endlosschleife weil Du die Datei ja in jedem Schleifendurchlauf um eine Zeile erweiterst, die dann im nächsten Schleifendurchlauf gelesen wird, in dem dann die Datei wieder um eine Zeile erweitert wird, und dass dann "unendlich". Solange bis die Platte voll ist, was bei heutigen Plattengrössen eine Weile dauern könnte.
Erst einmal das ganz grundsätzlich eine Schleife über die Zeilen endet wenn die Zeilen alle gelesen wurden, einmal tatsächlich als Schleife und dann was passiert wenn man den Iterator wiederholt nach dem nächsten Element fragt:
Code: Alles auswählen
In [22]: !cat movies.csv
Love actually
Die Hard
The Grinch
In [23]: file = open("movies.csv")
In [24]: for movie_name in file:
...: print(movie_name)
...:
Love actually
Die Hard
The Grinch
In [25]: file.close()
In [26]: file = open("movies.csv")
In [27]: next(file)
Out[27]: 'Love actually\n'
In [28]: next(file)
Out[28]: 'Die Hard\n'
In [29]: next(file)
Out[29]: 'The Grinch\n'
In [30]: next(file)
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-30-0f391ff92824> in <module>
----> 1 next(file)
StopIteration:
Und jetzt das der ``in``-Operator den Iterator komplett durchgeht:
Code: Alles auswählen
In [32]: file = open("movies.csv")
In [33]: 'something' in file
Out[33]: False
In [34]: next(file)
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-34-0f391ff92824> in <module>
----> 1 next(file)
StopIteration:
In [35]: file.close()
Nach dem ``in`` kann man keine Zeilen mehr von `file` bekommen, weil die für den Test schon alle ”verbraucht” wurden.
Zur Kodierung: Dann hast Du doch sogar schon ein praktisches Beispiel warum die Kodierungsangabe *wichtig* ist, und die weg zu lassen ein *Fehler*. Wenn Du UTF-8 explizit angibst, dann funktioniert das unter Windows *und* auf dem IPad. Ohne kannst Du die Daten zwischen den beiden Systemen nicht austauschen, sofern die Texte sich nicht auf ASCII beschränken. Und selbst das kann dann auf Systemen Probleme machen, bei denen eine Kodierung eingestellt ist, die ASCII nicht als Untermenge hat. Keine Ahnung wie weit so etwas beispielsweise im asiatischen oder arabischen Raum verbreitet ist.