cách đọc một chuỗi dài nhiều dòng từng dòng trong python


84

Tôi có một bức tường của một chuỗi với nhiều dòng. Làm cách nào để đọc từng dòng một với một formệnh đề? Đây là những gì tôi đang cố gắng thực hiện và tôi gặp lỗi trên var textData được tham chiếu trong for line in textDatadòng.

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

Biến textData không tồn tại, tôi in nó trước khi gỡ xuống, nhưng tôi nghĩ rằng trình biên dịch trước đang phát sinh lỗi.

TIA

Dennis


Bạn cần chia dòng của mình thành các chuỗi riêng biệt. Có "/ n" trong nó không làm cho nó trở thành một chuỗi riêng biệt.
N_A

Bạn đang gặp lỗi gì (với tính năng theo dõi)? Giá trị trong là textDatagì? Bạn có thể cung cấp cho chúng tôi SSCCE , thứ mà chúng tôi có thể chạy và gặp vấn đề tương tự như bạn để chúng tôi có thể giải thích cho bạn không?
abarnert

Ngoài ra, "trình biên dịch trước" mà bạn nghĩ là "phát sinh lỗi" là gì?
abarnert

Câu trả lời:


142

Còn việc sử dụng .splitlines()thì sao?

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

@BenjaminGruenbaum: "/r""/n"chỉ là các chuỗi hai ký tự bình thường bao gồm một dấu gạch chéo và một chữ cái. Ý bạn là "\n"?
abarnert

Nó là một bản sao hay một trình lặp?
user3226167

@ user3226167 nó trả về một danh sách .
Benjamin Gruenbaum

Có phiên bản trình lặp của các đường phân tách sẽ không tạo danh sách mà thay vào đó trả về trong trình lặp không?
Youda008

Có StringIO, nhưng nó là một giao diện cấp thấp hơn. Điều đó nói rằng trong trường hợp này bạn đã có một chuỗi - nếu bạn muốn lặp lại một trình lặp (một tệp chẳng hạn) từng dòng một thì đó là một câu hỏi khác. Hãy nhớ - trong trường hợp này bạn đã có một chuỗi.
Benjamin Gruenbaum

6

bằng cách tách với dòng mới.

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

nếu bạn lặp qua một chuỗi, bạn đang lặp lại các ký tự theo ký tự trong chuỗi đó, không phải theo dòng.

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

a
b
c

Đối với bất kỳ ai đang đọc nội dung này, hãy sử dụng hàm str.splitlines () để thay thế. Một số trường hợp cạnh phát sinh với giải pháp này. Đối với người yêu cũ. giả sử bạn lặp lại từng dòng, nếu có \ n ở cuối dòng cuối cùng của đối tượng thì vòng lặp for của bạn sẽ thử và thực hiện một tác vụ trên một dòng trống gây ra lỗi. Đã thảo luận ở trên trong giải pháp được chấp nhận.
thefrollickingnerd Ngày

1

Câu trả lời này không thành công trong một số trường hợp cạnh tranh (xem phần bình luận). Giải pháp được chấp nhận ở trên sẽ xử lý những điều này. str.splitlines()là con đường để đi. Tuy nhiên, tôi sẽ để lại câu trả lời này như một tài liệu tham khảo.

Câu trả lời cũ (không chính xác):

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

lines = s.split('\n')
print(lines)
for line in lines:
    print(line)

Cảm ơn bạn, @PR bạn cũng đã dạy tôi điều gì đó. Tôi không có manh mối nào vềimport re
DKean

Tại sao bạn lại sử dụng re.splitthay vì str.split(hoặc splitlines) chỉ để tách trên các ký tự dòng mới? Việc xây dựng một biểu thức chính quy từ một ký tự tĩnh, duy nhất, chỉ làm cho mọi thứ trở nên phức tạp hơn mà không có lý do gì.
abarnert

@PR Để phù hợp với cuộc thảo luận trước, tôi nghĩ bạn nên viết s.split ('\ n'). Tách bằng r '\ n' không hoạt động.
David Epstein

sao chép và dán mã của tôi phù hợp với tôi (chỉ cần thử nó). nhưng nhìn vào nó bây giờ (sau 3 năm, tôi có thể vừa sử dụng s.splitThay đổi nó bây giờ.
PR

1
split('\n')sẽ giữ lại bất kỳ \rký tự nào trong vết chích. Việc vận chuyển sẽ không bị xóa, đó có thể là một vấn đề.
Tăm Anemone vào
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.