wie man eine lange mehrzeilige Zeichenfolge Zeile für Zeile in Python liest

84

Ich habe einen Wallop einer Schnur mit vielen Linien. Wie lese ich die Zeilen einzeln mit einer forKlausel? Folgendes versuche ich zu tun, und es wird eine Fehlermeldung für die in der for line in textDataZeile angegebene textData-Variable angezeigt .

for line in textData
    print line
    lineResult = libLAPFF.parseLine(line)

Die textData-Variable existiert zwar, ich drucke sie aus, bevor ich nach unten gehe, aber ich denke, dass der Pre-Compiler den Fehler auslöst.

TIA

Dennis

DKean
quelle
Sie müssen Ihre Zeile in separate Zeichenfolgen aufteilen. Ein "/ n" macht es nicht zu einer separaten Zeichenfolge.
N_A
Welchen Fehler erhalten Sie (mit dem Traceback)? Was ist der Wert in textData? Können Sie uns eine SSCCE geben , etwas, das wir ausführen und das gleiche Problem wie Sie sehen können, damit wir es Ihnen erklären können?
abarnert
Was ist der "Pre-Compiler", von dem Sie denken, dass er "den Fehler auslöst"?
Abarnert

Antworten:

142

Was ist mit .splitlines()?

for line in textData.splitlines():
    print(line)
    lineResult = libLAPFF.parseLine(line)
Benjamin Gruenbaum
quelle
@BenjaminGruenbaum: "/r"und "/n"sind nur normale zweistellige Zeichenfolgen, die aus einem Schrägstrich und einem Buchstaben bestehen. Meinten Sie "\n"?
abarnert
Ist es eine Kopie oder ein Iterator?
user3226167
@ user3226167 gibt eine Liste zurück .
Benjamin Gruenbaum
Gibt es eine Iteratorversion von Splitlines, die keine Liste erstellt, sondern im Iterator zurückgibt?
Youda008
Es gibt StringIO, aber es ist eine Schnittstelle auf niedrigerer Ebene. In diesem Fall haben Sie jedoch bereits eine Zeichenfolge. Wenn Sie einen Iterator (z. B. eine Datei) zeilenweise iterieren möchten, ist dies eine andere Frage. Denken Sie daran - in diesem Fall haben Sie bereits eine Zeichenfolge.
Benjamin Gruenbaum
6

durch Aufteilen mit Zeilenumbrüchen.

for line in wallop_of_a_string_with_many_lines.split('\n'):
  #do_something..

Wenn Sie über eine Zeichenfolge iterieren, iterieren Sie char für char in dieser Zeichenfolge, nicht zeilenweise.

>>>string = 'abc'
>>>for line in string:
    print line

a
b
c
thkang
quelle
Wenn Sie dies jetzt lesen, verwenden Sie stattdessen die Funktion str.splitlines (). Bei dieser Lösung treten einige Randfälle auf. Zum Beispiel. Angenommen, Sie iterieren über jede Zeile. Wenn am Ende der letzten Zeile des Objekts ein \ n steht, versucht Ihre for-Schleife, eine Aufgabe in einer leeren Zeile auszuführen, was zu Fehlern führt. Oben in akzeptierter Lösung besprochen.
thefrollickingnerd
1

Diese Antwort schlägt in einigen Randfällen fehl (siehe Kommentare). Die oben akzeptierte Lösung wird diese behandeln. str.splitlines()ist der Weg zu gehen. Ich werde diese Antwort dennoch als Referenz belassen.

Alte (falsche) Antwort:

s =  \
"""line1
line2
line3
"""

lines = s.split('\n')
print(lines)
for line in lines:
    print(line)
PR
quelle
Danke, @PR, du hast mir auch etwas beigebracht. Ich hatte keine Ahnung von derimport re
DKean
Warum sollten Sie re.splitanstelle von str.split(oder splitlines) nur Zeilenumbrüche aufteilen? Das Erstellen eines regulären Ausdrucks aus einem einzelnen statischen, wörtlichen Zeichen macht die Dinge ohne Grund nur komplizierter.
abarnert
@PR Um zur vorherigen Diskussion zu passen, sollten Sie s.split ('\ n') geschrieben haben. Das Teilen mit r '\ n' funktioniert nicht.
David Epstein
Das Kopieren und Einfügen meines Codes funktioniert für mich (habe es gerade ausprobiert). aber jetzt schauen (nach 3 Jahren hätte ich es einfach gebrauchen können s.split. Jetzt
PR
1
split('\n')behält alle \rZeichen innerhalb des Stichs. Wagenrückläufe werden nicht gelöscht, was ein Problem sein könnte.
Zahnstocher Anemone