jak czytać długie wielowierszowe ciągi znaków wiersz po wierszu w Pythonie

86

Mam sznurek z wieloma liniami. Jak czytać wiersze jeden po drugim z forklauzulą? Oto, co próbuję zrobić i pojawia się błąd w zmiennej textData, do której odwołuje się for line in textDatawiersz.

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

Zmienna textData istnieje, drukuję ją przed zejściem, ale wydaje mi się, że prekompilator wykopuje błąd.

TIA

Dennis

DKean
źródło
Musisz podzielić linię na osobne ciągi. Obecność „/ n” nie czyni go oddzielnym ciągiem.
N_A
Jaki błąd otrzymujesz (w przypadku śledzenia)? Jaka jest wartość textData? Czy możesz nam dać SSCCE , coś, co możemy uruchomić i zobaczyć ten sam problem co Ty, abyśmy mogli Ci go wyjaśnić?
abarnert
Co to jest „prekompilator”, o którym myślisz, że „podnosi błąd”?
abarnert

Odpowiedzi:

147

A co z używaniem .splitlines()?

for line in textData.splitlines():
    print(line)
    lineResult = libLAPFF.parseLine(line)
Benjamin Gruenbaum
źródło
@BenjaminGruenbaum: "/r"i "/n"są to zwykłe dwuznakowe ciągi składające się z ukośnika i litery. Czy miałeś na myśli "\n"?
abarnert
Czy to kopia czy iterator?
user3226167
@ user3226167 zwraca listę .
Benjamin Gruenbaum,
Czy istnieje iteratorowa wersja linii podziału, która nie tworzyłaby listy, ale zamiast tego zwracałaby ją w iteratorze?
Youda008
Jest StringIO, ale jest to interfejs niższego poziomu. To powiedziawszy, w tym przypadku masz już ciąg - jeśli chcesz iterować iterator (na przykład plik) linia po linii, to kolejne pytanie. Pamiętaj - w tym przypadku masz już ciąg.
Benjamin Gruenbaum
6

rozdzielając je nowymi liniami.

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

jeśli iterujesz po ciągu, wykonujesz iterację znak po znaku w tym ciągu, a nie po linii.

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

a
b
c
thkang
źródło
Każdy, kto teraz to czyta, powinien zamiast tego użyć funkcji str.splitlines (). Przy takim rozwiązaniu pojawiają się skrajne przypadki. Na przykład. powiedz, że wykonujesz iterację po każdej linii, jeśli na końcu ostatniej linii obiektu znajduje się \ n, wtedy twoja pętla for spróbuje wykonać zadanie na pustej linii, powodując błędy. Omówiono powyżej w przyjętym rozwiązaniu.
thefrollickingnerd
1

Ta odpowiedź zawodzi w kilku skrajnych przypadkach (patrz komentarze). Zaakceptowane powyżej rozwiązanie poradzi sobie z nimi. str.splitlines()jest droga do zrobienia. Niemniej jednak pozostawię tę odpowiedź jako odniesienie.

Stara (nieprawidłowa) odpowiedź:

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

lines = s.split('\n')
print(lines)
for line in lines:
    print(line)
PR
źródło
Dziękuję @PR Ty też mnie czegoś nauczyłeś. Nie miałem pojęcia oimport re
DKean
Dlaczego miałbyś używać re.splitzamiast str.split(lub splitlines) po prostu do dzielenia na znaki nowej linii? Budowanie wyrażenia regularnego z pojedynczego, statycznego, dosłownego znaku po prostu komplikuje sprawę bez powodu.
abarnert
@PR Aby dopasować się do poprzedniej dyskusji, myślę, że powinieneś był napisać s.split ('\ n'). Dzielenie za pomocą r '\ n' nie działa.
David Epstein
Kopiuj i wklej mój kod działa dla mnie (właśnie wypróbowałem). ale patrząc na to teraz (po 3 latach mogłem po prostu użyć s.split. Zmieniam to teraz
PR
1
split('\n')zachowa wszystkie \rznaki w żądle. Zwroty karetki nie zostaną usunięte, co może być problemem.
Wykałaczka Anemone