次のように、各行で操作を実行する複数行の文字列リテラルがあります。
inputString = """Line 1
Line 2
Line 3"""
次のようなことをしたい:
for line in inputString:
doStuff()
次のように、各行で操作を実行する複数行の文字列リテラルがあります。
inputString = """Line 1
Line 2
Line 3"""
次のようなことをしたい:
for line in inputString:
doStuff()
回答:
inputString.splitlines()
各アイテムのリストを提供します。このsplitlines()
メソッドは、各行をリスト要素に分割するように設計されています。
''.splitlines() == []
、に['']
なり''.split('\n')
ます。
他の人が言ったように:
inputString.split('\n') # --> ['Line 1', 'Line 2', 'Line 3']
これは上記と同じですが、stringモジュールの関数は非推奨であり、避ける必要があります。
import string
string.split(inputString, '\n') # --> ['Line 1', 'Line 2', 'Line 3']
または、各行にブレークシーケンス(CR、LF、CRLF)を含める場合は、 splitlines
メソッドにTrue
引数を指定してます。
inputString.splitlines(True) # --> ['Line 1\n', 'Line 2\n', 'Line 3']
inputString.split(os.linesep)
プラットフォーム固有の行終端記号を使用します。
を使用しstr.splitlines()
ます。
splitlines()
とは異なり、は改行を適切に処理しますsplit("\n")
。
また、@ efotinisで言及されているように、True
引数で呼び出されたときに分割結果に改行文字をオプションで含めるという利点もあります。
使用すべきでない理由の詳細な説明split("\n")
:
\n
Pythonでは、実行するプラットフォームとは関係なく、Unixの改行(ASCII 10進コード10)を表します。ただし、改行の表現はプラットフォームに依存します。Windowsでは\n
2文字でCR
ありLF
(ASCII 10進コード13と10、AKA \r
および\n
)、最新のUnix(OS Xを含む)では1文字LF
です。
print
たとえば、プラットフォームに一致しない行末の文字列がある場合でも正しく動作します。
>>> print " a \n b \r\n c "
a
b
c
ただし、「\ n」で明示的に分割すると、プラットフォームに依存する動作になります。
>>> " a \n b \r\n c ".split("\n")
[' a ', ' b \r', ' c ']
あなたが使用している場合でもos.linesep
、それだけで、あなたのプラットフォーム上での改行区切りに応じて分割され、あなたが他のプラットフォームで作成したテキストを処理し、または裸にしている場合に失敗します\n
。
>>> " a \n b \r\n c ".split(os.linesep)
[' a \n b ', ' c ']
splitlines
これらすべての問題を解決します:
>>> " a \n b \r\n c ".splitlines()
[' a ', ' b ', ' c ']
テキストモードでファイルを読み取ると、Python \n
がプラットフォームの改行表現に変換されるため、改行表現の問題が部分的に緩和されます。ただし、テキストモードはWindowsにのみ存在します。UNIXシステムでは、すべてのファイルがバイナリモードで開かれるためsplit('\n')
、UNIXシステムでWindowsファイルを使用すると、望ましくない動作が発生します。また、ソケットなどの他のソースとは改行が異なる可能性のある文字列を処理することも珍しくありません。
splitlines
に分割されます任意のラインエンディング。split(os.linesep)
たとえば、UNIXでWindowsファイルを読み取ると失敗します
この特定のケースではやり過ぎかもしれませんが、別のオプションにはStringIO
、ファイルのようなオブジェクトを作成するためのの使用が含まれます
for line in StringIO.StringIO(inputString):
doStuff()
str.split
、メモリを割り当てる必要がないことです(文字列をインプレースで読み取ります)。欠点は、使用するとかなり遅くなることですStringIO
(約50倍)。cStringIO
ただし、
元の投稿は、いくつかの行(ある条件に該当する場合)と次の行を出力するコードを要求しました。私の実装はこれです:
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の回答にはより多くのバンプが必要であり、彼の回答を増やしたいので、コメントに適切なコードテキスト形式を設定したいと思います。とにかく、彼は私を次のテクニックに導いてくれました。使用可能な場合はcStringIOを使用します(ただし、cStringIOとStringIOは同じではありません。これは、cStringIOをサブクラス化できないためです...組み込みです...しかし、基本的な操作の構文は同じであるため、これを行うことができます):
try:
import cStringIO
StringIO = cStringIO
except ImportError:
import StringIO
for line in StringIO.StringIO(variable_with_multiline_string):
pass
print line.strip()