ファイル abc の内容:
a
b
c
コードは
data_fh = open("abc")
str = data_fh.read()
arr = str.split("\n")
print len(arr)
data_fh.seek(0)
arr = data_fh.read().splitlines()
print len(arr)
しかし、出力は次のとおりです。
4
3
それで、それはなぜですか?
ファイル abc の内容:
a
b
c
コードは
data_fh = open("abc")
str = data_fh.read()
arr = str.split("\n")
print len(arr)
data_fh.seek(0)
arr = data_fh.read().splitlines()
print len(arr)
しかし、出力は次のとおりです。
4
3
それで、それはなぜですか?
.splitlines()
最後に空の行が含まれていないため、while.split('\n')
は最後の空の文字列を返します...\n
。
>>> 'last\n'.split('\n')
['last', '']
>>> 'last\n'.splitlines()
['last']
これはstr.splitlines()
ドキュメントで明示的に言及されています:
split()
区切り文字列sepが指定された場合とは異なり、このメソッドは空の文字列に対して空のリストを返し、終端の改行は余分な行にはなりません。
末尾に改行がない場合、出力は同じです。
>>> 'last'.split('\n')
['last']
>>> 'last'.splitlines()
['last']
つまり、何もstr.split()
追加しませんが、削除します。str.splitlines()
末尾に改行がある可能性があります。
>>> s = 'a\nb\nc\n' # <-- notice the \n at the end
>>>
>>> s.split('\n')
['a', 'b', 'c', '']
>>>
>>> s.splitlines()
['a', 'b', 'c']
split()
最後に空の文字列が残ることに注意してくださいsplitlines()
。
余談ですが、組み込み関数str
によって既に使用されているため、変数名として使用しないでください。