як читати довгий багаторядковий рядок за рядком у python


84

У мене є волоска струни з багатьма рядками. Як прочитати рядки один за одним із forреченням? Ось те, що я намагаюся зробити, і я отримую повідомлення про помилку у текстовому файлі var, на який посилається for line in textDataрядок.

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

Змінна textData справді існує, я друкую її перед тим, як знизитися, але я думаю, що попередній компілятор видаляє помилку.

ТІА

Денніс


Вам потрібно розділити ваш рядок на окремі рядки. Наявність в ньому "/ n" не робить його окремим рядком.
N_A

Яку помилку ви отримуєте (з відстеженням)? У чому цінність textData? Чи можете ви дати нам SSCCE , щось ми можемо запустити і побачити ту ж проблему, що і ви, щоб ми могли пояснити вам це?
abarnert

Крім того, що таке "попередній компілятор", який, на вашу думку, "видаляє помилку"?
abarnert

Відповіді:


142

А як щодо використання .splitlines()?

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

@BenjaminGruenbaum: "/r"і "/n"це просто звичайні двосимвольні рядки, що складаються з косої риски та букви. Ви мали на увазі "\n"?
abarnert

Це копія чи ітератор?
user3226167 05

@ user3226167 повертає список .
Бенджамін Груенбаум

Чи існує версія ітератора сплітлінів, яка не створює список, а замість цього повертається в ітераторі?
Youda008

Існує 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

Для тих, хто читає це зараз, використовуйте замість цього функцію 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 ти мене теж чогось навчив. Я не мав поняття проimport re
DKean

Чому ви використовуєте re.splitзамість str.split(або splitlines) просто розділення символів нового рядка? Побудова регулярного виразу з одного, статичного, буквального символу просто ускладнює речі без причини.
abarnert

@PR Щоб відповідати попередній дискусії, я думаю, вам слід було написати s.split ('\ n'). Розбиття за допомогою r '\ n' не працює.
Девід Епштейн,

скопіювати та вставити мій код працює для мене (просто спробував). але дивлячись на це зараз (через 3 роки, я міг би просто використати s.split. Змінити зараз
PR

1
split('\n')збереже будь-які \rсимволи в жалі. Повернення кареток не видаляються, що може бути проблемою.
Зубочистка Анемона
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.