как читать длинную многострочную строку построчно в Python

86

У меня есть оборванная струна с множеством строк. Как мне прочитать строки одну за другой с forпредложением? Вот что я пытаюсь сделать и получаю сообщение об ошибке в переменной textData, указанной в for line in textDataстроке.

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

Переменная textData существует, я распечатываю ее перед тем, как спуститься, но думаю, что прекомпилятор выдает ошибку.

TIA

Деннис

DKean
источник
Вам нужно разделить вашу строку на отдельные строки. Наличие "/ n" не делает его отдельной строкой.
N_A
Какую ошибку вы получаете (с трассировкой)? В чем ценность textData? Можете ли вы дать нам SSCCE , что-то, что мы можем запустить и увидеть ту же проблему, что и вы, чтобы мы могли вам ее объяснить?
abarnert
Кроме того, что такое «предварительный компилятор», который, по вашему мнению, «выдает ошибку»?
abarnert

Ответы:

147

А как насчет использования .splitlines()?

for line in textData.splitlines():
    print(line)
    lineResult = libLAPFF.parseLine(line)
Бенджамин Грюнбаум
источник
@BenjaminGruenbaum: "/r"и "/n"представляют собой обычные двухсимвольные строки, состоящие из косой черты и буквы. Вы имели в виду "\n"?
abarnert
Это копия или итератор?
user3226167 05
@ user3226167 возвращает список .
Бенджамин Грюнбаум
Есть ли итераторная версия splitlines, которая не будет создавать список, а вместо этого возвращается в итераторе?
Youda008 01
Есть StringIO, но это интерфейс более низкого уровня. Тем не менее, в этом случае у вас уже есть строка - если вы хотите перебирать итератор (например, файл) построчно, это другой вопрос. Помните - в этом случае у вас уже есть строка.
Бенджамин Грюнбаум
6

путем разделения с новой строкой.

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

если вы перебираете строку, вы повторяете char по char в этой строке, а не по строке.

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

a
b
c
thkang
источник
Для тех, кто читает это сейчас, используйте вместо этого функцию str.splitlines (). С этим решением возникают некоторые крайние случаи. Например, скажем, вы перебираете каждую строку, если в конце последней строки объекта есть \ n, тогда ваш цикл for попытается выполнить задачу на пустой строке, вызывая ошибки. Обсуждалось выше в принятом решении.
thefrollickingnerd
1

Этот ответ не работает в нескольких крайних случаях (см. Комментарии). Принятое выше решение справится с этим. str.splitlines()это путь. Тем не менее, я оставлю этот ответ как ссылку.

Старый (неверный) ответ:

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

lines = s.split('\n')
print(lines)
for line in lines:
    print(line)
PR
источник
Спасибо, @PR, ты тоже кое-чему меня научил. Я понятия не имел оimport re
DKean
Зачем использовать re.splitвместо str.split(или splitlines) просто для разделения на символы новой строки? Построение регулярного выражения из одного статического буквального символа просто усложняет задачу без всякой причины.
abarnert
@PR Чтобы соответствовать предыдущему обсуждению, я думаю, вам следовало написать s.split ('\ n'). Разделение с помощью r '\ n' не работает.
Дэвид Эпштейн
копирование и вставка моего кода работает для меня (просто попробовал). но глядя на это сейчас (через 3 года я мог бы просто использоватьs.split . Меняю его сейчас
PR
1
split('\n') сохранит любые \r символы внутри жала. Возврат каретки не удаляется, что может быть проблемой.
Зубочистка Anemone