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


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)

@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

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)

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.