次のように、各行で操作を実行したい複数行の文字列があります。
inputString = """Line 1
Line 2
Line 3"""
各行で繰り返したい:
for line in inputString:
doStuff()
inputString.splitlines()
各項目のリストが表示されます。このsplitlines()
メソッドは、各行をリスト要素に分割するように設計されています。
他の人が言ったように:
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.splitlines()
ます。
splitlines
良いのかsplitlines
とは異なり、改行を適切に処理しますsplit
。
また、オプションで、引数を指定して呼び出されたときに分割結果に改行文字を返すこともできますTrue
。これは、特定のシナリオで役立ちます。
split("\n")
を使用split
すると、オペレーティング システム間でファイルを共有するときに非常に紛らわしいバグが発生します。
\n
Python では、実行する OS に関係なく、Unix の改行 (ASCII 10 進コード 10) を表します。ただし、ASCII 改行表現は OS に依存します。
Windows では、と(ASCII 10 進コード 13 と 10、および) の\n
2 文字ですが、最新の Unix (Mac OS X、Linux、Android) では 1 文字です。CR
LF
\r
\n
LF
print
プラットフォームに一致しない行末を持つ文字列がある場合でも、正しく機能します。
>>> print " a \n b \r\n c "
a
b
c
ただし、「\n」で明示的に分割すると、OS に依存した動作になります。
>>> " 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 ']
テキスト モードでファイルを読み取る\n
と、Python の改行表現がプラットフォームの改行表現に変換されるため、改行表現の問題が部分的に軽減されます。
ただし、テキスト モードは Windows にのみ存在します。Unix システムでは、すべてのファイルがバイナリ モードで開かれるためsplit('\n')
、UNIX システムで Windows ファイルを使用すると、望ましくない動作が発生します。これは、ネットワークでファイルを転送するときにも発生する可能性があります。
@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()