Her satırda bir işlem yapmak istediğiniz gibi çok satırlı dize değişmez var, bu yüzden:
inputString = """Line 1
Line 2
Line 3"""
Aşağıdaki gibi bir şey yapmak istiyorum:
for line in inputString:
doStuff()
Her satırda bir işlem yapmak istediğiniz gibi çok satırlı dize değişmez var, bu yüzden:
inputString = """Line 1
Line 2
Line 3"""
Aşağıdaki gibi bir şey yapmak istiyorum:
for line in inputString:
doStuff()
Yanıtlar:
inputString.splitlines()
Her öğeyle birlikte bir liste verecek, splitlines()
yöntem her satırı bir liste öğesine bölmek için tasarlanmıştır.
''.splitlines() == []
değil . ['']
''.split('\n')
Diğerlerinin söylediği gibi:
inputString.split('\n') # --> ['Line 1', 'Line 2', 'Line 3']
Bu yukarıdakilerle aynıdır, ancak dize modülünün işlevleri kullanımdan kaldırılmıştır ve bundan kaçınılmalıdır:
import string
string.split(inputString, '\n') # --> ['Line 1', 'Line 2', 'Line 3']
Alternatif olarak, her satırın kesme sırasını (CR, LF, CRLF) içermesini istiyorsanız, splitlines
yöntemi True
bağımsız değişkenle kullanın:
inputString.splitlines(True) # --> ['Line 1\n', 'Line 2\n', 'Line 3']
inputString.split(os.linesep)
platforma özel hat sonlandırıcısını kullanacaktır.
Kullanınstr.splitlines()
.
splitlines()
aksine yeni satırları düzgün işler split("\n")
.
Ayrıca, @efotinis tarafından, isteğe bağlı olarak, True
bağımsız değişken çağrıldığında yeni satır karakterini bölünmüş sonuca dahil etme avantajı vardır .
Neden kullanmamanız gerektiğine dair ayrıntılı açıklama split("\n")
:
\n
, Python'da, çalıştırdığınız platformdan bağımsız olarak bir Unix satır sonunu (ASCII ondalık kodu 10) temsil eder. Ancak, linebreak temsili platforma bağlıdır . Windows'da \n
iki karakter CR
ve LF
(ASCII ondalık kodları 13 ve 10, AKA \r
ve \n
), herhangi bir modern Unix'te (OS X dahil), tek karakterdir LF
.
print
örneğin, platformunuzla eşleşmeyen satır sonlarına sahip bir dizeniz olsa bile doğru şekilde çalışır:
>>> print " a \n b \r\n c "
a
b
c
Ancak, açıkça "\ n" üzerine bölmek, platforma bağlı davranış sağlar:
>>> " a \n b \r\n c ".split("\n")
[' a ', ' b \r', ' c ']
Kullansanız bile os.linesep
, yalnızca platformunuzdaki yeni satır ayırıcısına göre bölünür ve diğer platformlarda veya çıplak bir şekilde oluşturulmuş metni işlerseniz başarısız olur \n
:
>>> " a \n b \r\n c ".split(os.linesep)
[' a \n b ', ' c ']
splitlines
tüm bu sorunları çözer:
>>> " a \n b \r\n c ".splitlines()
[' a ', ' b ', ' c ']
Metin modunda dosyaları okumak , Python'ları \n
platformun yeni satır temsiline dönüştürdüğü için yeni satır temsil sorununu kısmen azaltır . Ancak, metin modu yalnızca Windows'ta bulunur. Unix sistemlerde, tüm dosyalar ikili modda açılır, bu nedenle split('\n')
Windows dosyası olan bir UNIX sisteminde kullanılması istenmeyen davranışlara neden olur. Ayrıca, bir soket gibi diğer kaynaklardan potansiyel olarak farklı yeni satırlara sahip dizeleri işlemek olağandışı değildir.
splitlines
bölünecek not . Örneğin, split(os.linesep)
Bu özel durumda aşırıya kaçabilir, ancak başka bir seçenek StringIO
dosya benzeri bir nesne oluşturmak için kullanmayı içerir
for line in StringIO.StringIO(inputString):
doStuff()
str.split
, olan herhangi bir bellek ayrılamadı gerek yok (o dize yerinde okur). Bir dezavantaj, kullanmanızın daha yavaş olmasıdırStringIO
(yaklaşık 50x). cStringIO
Bununla birlikte,
Bazı satırları (bazı koşullar için doğruysa) ve sonraki satırı yazdıran kod için istenen orijinal gönderi. Benim uygulama bu olurdu:
text = """1 sfasdf
asdfasdf
2 sfasdf
asdfgadfg
1 asfasdf
sdfasdgf
"""
text = text.splitlines()
rows_to_print = {}
for line in range(len(text)):
if text[line][0] == '1':
rows_to_print = rows_to_print | {line, line + 1}
rows_to_print = sorted(list(rows_to_print))
for i in rows_to_print:
print(text[i])
@ 1_CR 'ın cevabının daha fazla yumruya ihtiyacı olduğunu düşündüğüm için yorumların uygun kod metni biçimlendirmesini diliyorum ve cevabını arttırmak istiyorum. Her neyse, beni şu tekniğe götürdü; varsa cStringIO'yu kullanır (AMA NOT: cStringIO ve StringIO aynı değildir , çünkü cStringIO'yu alt sınıflandıramazsınız ... bu yerleşiktir ... ancak temel işlemler için sözdizimi aynı olacaktır, böylece bunu yapabilirsiniz ):
try:
import cStringIO
StringIO = cStringIO
except ImportError:
import StringIO
for line in StringIO.StringIO(variable_with_multiline_string):
pass
print line.strip()