note.nkmk.me

Pythonで改行を含む文字列の出力、連結、分割、削除、置換

Date: 2018-02-09 / Modified: 2018-07-09 / tags: Python, 文字列操作

Pythonにおける改行を含む文字列の操作について、

  • 改行を含む文字列を作成、print出力(表示)する方法
  • 文字列のリスト(配列)を改行して連結(結合)する方法
  • 文字列を改行ごとに分割してリスト化する方法
  • 改行コードを削除または置換する方法
  • 末尾の改行なしでprint出力する方法

を説明する。

スポンサーリンク

改行を含む文字列を作成、print出力(表示)

改行コード \n(LF), \r\n(CR+LF)

文字列内に改行コード\n\r\nを挿入すると改行される。

s = 'Line1\nLine2\nLine3'
print(s)
# Line1
# Line2
# Line3

s = 'Line1\r\nLine2\r\nLine3'
print(s)
# Line1
# Line2
# Line3

Macを含むUnix系では\n(LF)、Windows系では\r\n(CR+LF)が改行コードとして使われる。エディタによっては改行コードを選択できるものもある。

トリプルクォート ''' or """

トリプルクォート'''または"""で囲むと改行も含めてそのままの文字列となる。

s = '''Line1
Line2
Line3'''
print(s)
# Line1
# Line2
# Line3

インデントを付けたい場合

トリプルクォートはスペースもそのまま文字列となるので、コード上でキレイに書こうとして以下のようにインデントを入れると不要なスペースが挿入されてしまう。

s = '''
    Line1
    Line2
    Line3
    '''
print(s)
# 
#     Line1
#     Line2
#     Line3
#     

バックスラッシュ\を使ってコード中の改行を無視して継続行とすることで以下のように書ける。

各行を''または""で囲み、文末に改行文字\nを加える。

s = 'Line1\n'\
    'Line2\n'\
    'Line3'
print(s)
# Line1
# Line2
# Line3

ここでは文字列リテラルを連続すると連結されるという文法を利用している。詳細は以下の記事を参照。

文字列中にインデントを加えたい場合は各行の文字列にスペースを加えればOK。

s = 'Line1\n'\
    '    Line2\n'\
    '        Line3'
print(s)
# Line1
#     Line2
#         Line3

また、括弧(())で囲まれている部分では自由に改行できるので、バックスラッシュを使わずに括弧()を使って以下のように書くこともできる。

s = ('Line1\n'
     'Line2\n'
     'Line3')
print(s)
# Line1
# Line2
# Line3

s = ('Line1\n'
     '    Line2\n'
     '        Line3')
print(s)
# Line1
#     Line2
#         Line3

行頭を揃えたいだけならトリプルクォートの最初の行にバックスラッシュ\を加えるだけでもいい。

s = '''\
Line1
Line2
Line3'''
print(s)
# Line1
# Line2
# Line3

s = '''\
Line1
    Line2
        Line3'''
print(s)
# Line1
#     Line2
#         Line3

文字列のリスト(配列)を改行して連結(結合)

文字列メソッドjoin()を使うと、文字列のリスト(配列)を一つの文字列に連結(結合)することができる。改行文字\n\r\nを使えば文字列要素ごとに改行されて連結される。

l = ['Line1', 'Line2', 'Line3']
s = '\n'.join(l)
print(s)
# Line1
# Line2
# Line3

join()についての詳細は以下の記事を参照。

文字列を改行ごとに分割、リスト化: splitlines()

文字列メソッドsplitlines()で文字列を改行ごとに分割し、リスト化できる。

s = 'Line1\nLine2\r\nLine3'
l = s.splitlines()
print(l)
# ['Line1', 'Line2', 'Line3']

splitlines()\n(LF: Mac含むUnix系)も\r\n(CRLF: Windows系)も改行コードとして分割してくれる。

splitlines()についての詳細は以下の記事を参照。

改行コードの削除、置換

splitlines()join()を組み合わせることで、改行を含む文字列から改行コードを削除(除去)したり他の文字列に置換したりすることができる。改行コードの変更も可能。

s = 'Line1\nLine2\r\nLine3'

s_new = ''.join(s.splitlines())
print(s_new)
# Line1Line2Line3

s_new = ' '.join(s.splitlines())
print(s_new)
# Line1 Line2 Line3

s_new = ','.join(s.splitlines())
print(s_new)
# Line1,Line2,Line3

s_new = '\r\n'.join(s.splitlines())
print(s_new)
# Line1
# Line2
# Line3

上述のようにsplitlines()\n(LF: Mac含むUnix系)も\r\n(CRLF: Windows系)も改行として分割してくれるので、splitlines()join()を組み合わせる方法の場合は特に改行コードを気にする必要はない。

改行コードがはっきりしている場合は、文字列を置き換えるreplace()メソッドでもOK。

s = 'Line1\nLine2\nLine3'

s_new = s.replace('\n', '')
print(s_new)
# Line1Line2Line3

s_new = s.replace('\n', ',')
print(s_new)
# Line1,Line2,Line3

ただし、想定と異なる改行コードが含まれているとうまくいかないので注意。

s = 'Line1\nLine2\r\nLine3'

s_new = s.replace('\n', ',')
print(s_new)
# ,Line3

s_new = s.replace('\r\n', ',')
print(s_new)
# Line1
# Line2,Line3

replace()を繰り返して複数の改行コードを置き換えることもできるが、\r\nには\nが含まれているので順番を間違えるとうまくいかない。上述のsplitlines()join()を組み合わせた方法だと改行コードを気にする必要がないので安全。

s = 'Line1\nLine2\r\nLine3'

s_new = s.replace('\r\n', ',').replace('\n', ',')
print(s_new)
# Line1,Line2,Line3

s_new = s.replace('\n', ',').replace('\r\n', ',')
print(s_new)
# ,Line3

s_new = ','.join(s.splitlines())
print(s_new)
# Line1,Line2,Line3

文末の改行コードを削除するだけならrstrip()メソッドでもOK。rstrip()は文字列の右端の空白文字(改行含む)を削除するメソッド。

s = 'aaa\n'
print(s + 'bbb')
# aaa
# bbb

s_new = s.rstrip()
print(s_new + 'bbb')
# aaabbb

print()関数ではデフォルトで末尾に改行が追加される。このため連続してprint()を実行すると各出力結果が改行されて表示される。

print('a')
print('b')
print('c')
# a
# b
# c

これは末尾に追加する文字列を指定するprint()の引数endのデフォルト値が改行記号'\n'になっているから。

末尾で改行させないようにするには引数endを空文字列''とすればOK。末尾の改行なしで出力される。

print('a', end='')
print('b', end='')
print('c', end='')
# abc

引数endには任意の文字列を指定可能。

print('a', end='-')
print('b', end='-')
print('c')
# a-b-c

ただし、文字列を連結して出力したい場合はprint()endで指定するより元の文字列を連結したほうが楽。以下の記事を参照。

スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事