it-swarm.com.de

Wie teile ich eine mehrzeilige Zeichenfolge in mehrere Zeilen auf?

Ich habe ein mehrzeiliges String-Literal, mit dem ich in jeder Zeile eine Operation ausführen möchte:

inputString = """Line 1
Line 2
Line 3"""

Ich möchte Folgendes tun:

for line in inputString:
    doStuff()
255
bradtgmurray
inputString.splitlines()

Gibt Ihnen eine Liste mit jedem Element, die splitlines() -Methode wurde entwickelt, um jede Zeile in ein Listenelement aufzuteilen.

385
UnkwnTech

Wie die anderen sagten:

inputString.split('\n')  # --> ['Line 1', 'Line 2', 'Line 3']

Dies ist identisch mit dem obigen, aber die Funktionen des Zeichenfolgenmoduls sind veraltet und sollten vermieden werden:

import string
string.split(inputString, '\n')  # --> ['Line 1', 'Line 2', 'Line 3']

Wenn Sie alternativ möchten, dass jede Zeile die Unterbrechungssequenz (CR, LF, CRLF) enthält, verwenden Sie die splitlines -Methode mit einem True -Argument:

inputString.splitlines(True)  # --> ['Line 1\n', 'Line 2\n', 'Line 3']
196
efotinis

Verwenden Sie str.splitlines().

splitlines() behandelt Zeilenumbrüche im Gegensatz zu split("\n") richtig.

Es hat auch den von @efotinis erwähnten Vorteil, dass das Newline-Zeichen optional in das Split-Ergebnis einbezogen wird, wenn es mit einem True-Argument aufgerufen wird.


Detaillierte Erklärung, warum Sie split("\n") nicht verwenden sollten:

\n In Python steht für einen Unix-Zeilenumbruch (ASCII-Dezimalcode 10), unabhängig von der Plattform, auf der Sie ihn ausführen. Allerdings die Zeilenumbruchdarstellung ist plattformabhängig . Unter Windows besteht \n Aus zwei Zeichen, CR und LF (ASCII-Dezimalcodes 13 und 10, AKA \r Und \n). Auf jedem modernen Unix (einschließlich OS X) ist es das einzelne Zeichen LF.

print funktioniert beispielsweise auch dann ordnungsgemäß, wenn Sie eine Zeichenfolge mit Zeilenenden haben, die nicht zu Ihrer Plattform passen:

>>> print " a \n b \r\n c "
 a 
 b 
 c

Die explizite Aufteilung auf "\ n" führt jedoch zu plattformabhängigem Verhalten:

>>> " a \n b \r\n c ".split("\n")
[' a ', ' b \r', ' c ']

Selbst wenn Sie os.linesep Verwenden, wird es nur entsprechend dem Zeilenumbruchstrenner auf Ihrer Plattform aufgeteilt und schlägt fehl, wenn Sie auf anderen Plattformen erstellten Text oder mit einem leeren \n Verarbeiten:

>>> " a \n b \r\n c ".split(os.linesep)
[' a \n b ', ' c ']

splitlines löst all diese Probleme:

>>> " a \n b \r\n c ".splitlines()
[' a ', ' b ', ' c ']

Lesen von Dateien im Textmodus verringert das Problem der Darstellung von Zeilenumbrüchen teilweise, da Pythons \n In die Darstellung von Zeilenumbrüchen der Plattform konvertiert wird. Der Textmodus ist jedoch nur unter Windows verfügbar. Auf Unix-Systemen werden alle Dateien im Binärmodus geöffnet, sodass die Verwendung von split('\n') in einem UNIX-System mit einer Windows-Datei zu unerwünschtem Verhalten führt. Außerdem ist es nicht ungewöhnlich, Zeichenfolgen mit potenziell unterschiedlichen Zeilenumbrüchen aus anderen Quellen zu verarbeiten, z. B. aus einem Socket.

46
goncalopp

Könnte in diesem speziellen Fall übertrieben sein, aber eine andere Option beinhaltet die Verwendung von StringIO, um ein dateiähnliches Objekt zu erstellen

for line in StringIO.StringIO(inputString):
    doStuff()
19
iruvar

Der ursprüngliche Beitrag, der für Code angefordert wurde, der einige Zeilen druckt (sofern diese für eine bestimmte Bedingung zutreffen), plus die folgende Zeile. Meine Implementierung wäre dies:

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
Finrod Felagund

Ich wünschte, Kommentare hätten die richtige Formatierung des Codetextes, da ich denke, dass die Antwort von @ 1_CR mehr Unebenheiten erfordert, und ich möchte seine Antwort erweitern. Wie auch immer, er führte mich zu der folgenden Technik; es wird cStringIO verwenden, falls verfügbar (ABER HINWEIS: cStringIO und StringIO sind nicht dasselbe, da Sie cStringIO nicht in Unterklassen unterteilen können ... es ist eingebaut ... aber für grundlegende Operationen wird die Syntax verwendet identisch, so können Sie dies tun):

try:
    import cStringIO
    StringIO = cStringIO
except ImportError:
    import StringIO

for line in StringIO.StringIO(variable_with_multiline_string):
    pass
print line.strip()
1
Mike S