リファクタリングをPythonで実践!基本手法とコード例・注意点まで
Pythonで文字列などを出力した際に、うまく改行できず、期待通りの結果にならないことはないでしょうか。今回はそんな悩みを解決すべく、改行の上手な使い方を解説していきます。
1.Pythonでの改行とは?
Pythonの改行には「改行コード」を使います。では改行コードとはなんでしょうか。
改行コードとは、文字列の中で改行がある部分を示す文字コードのこと。改行コードを入れることによって、コンピュータは改行をするかどうかを判断してくれるのです。
改行コードは利用している環境により異なり、
・MacOSなら「\r」
・Unixなら「\n」
・Windowsなら「\r\n」
がそれぞれ利用されています。
改行コードをはじめとする文字コードを「特殊文字」と言います。自然言語では使われないプログラミング特有の文字なのではじめは見慣れないかもしれませんが、よく使うので覚えておきましょう。
2.出力する際の改行方法
ここからは実際の改行方法について説明していきます。
① 改行コードを挿入して改行
はじめに、これまで紹介してきた改行コード(\nや\r\n )を用いた改行方法から紹介します。
実際の例を見ていきましょう。
string = "Hello\nWorld"
print(string)
#Hello
#World
今回の例ではHelloとWorldの間に改行コードを入れました。その結果、Worldが二行目に出力されています。このように文字列の途中に改行コードを入れることによって、改行ができます。
②トリプルクォートで囲む
次にトリプルクォートを用いた方法を説明します。実際の例を見ていきましょう。
string = '''Taro
Jiro
Saburo'''
print(string)
# Taro
# Jiro
# Saburo
トリプルクォート内に記入された文字列は、改行をそのまま出力できます。こちらのほうがより直観的に理解しやすいですね。
3.コード内での改行方法
ソースコード内で長い文字列を扱う際、改行を行いたい場合はどうすればいいのでしょうか。先ほどの例で紹介したように、トリプルクォートを用いて改行を行ってしまうと文字列自体も改行されてしまいます。
ここではソースコード内での文字列を見た目だけ改行する方法を紹介します。
print("Yeaaaaah!! Taro \
Jiro \
Saburo")
# Yeaaaaah!! Taro Jiro Saburo
ご覧の通り、ソースコードは改行されていますが、出力された文字列は改行されていません。このように、\(バックスラッシュ)をつけることで、コードの動作自体には影響を与えずにソースコード内でのみ改行できます。
4.改行コードの置換方法
ここからは改行コードを置換する方法を紹介します。
① splitlinesメソッドで分割後、joinメソッドで連結
文字列メソッドの「splitlinesメソッド」は、文字列を改行ごとに分割しリスト化します。その後「joinメソッド」でリスト内の各要素を結合することで、改行コードを置換できます。
実際のソースコードを見てみましょう。
string = "Taro\nJiro\nSaburo"
print(string.splitlines())
# ['Taro', 'Jiro', 'Saburo']
print("".join(string.splitlines()))
# TaroJiroSaburo
print(",".join(string.splitlines()))
# Taro,Jiro,Saburo
splitlinesメソッドは改行が入った位置で要素を区切り、リストで返すメソッドになります。string.splitlinesの結果を見ると、リストで名前毎に区切られていることが分かりますね。
次にjoinメソッドです。joinメソッドは文字列.join(リスト)という形で使います。文字列をリストの各要素の間に入れて、結合した文字列を出力します。
ひとつ目の例では空文字を間に結合しているため、各要素が結合した文字列が出力されていますね。ふたつ目の例ではカンマを入れて結合しているため、各要素の間にカンマが入った文字列が出力されています。
② replaceメソッドで置換
replaceメソッドを利用する置換方法も存在します。こちらは直感的でわかりやすい反面、\r\nや\nが含まれている場合に順番を間違えると、正しく置換できないので注意が必要です。
まずは正しい例を見ていきましょう。
string = "Taro\nJiro\nSaburo"
print(string.replace('\n', ","))
# Taro,Jiro,Saburo
replaceメソッドでは第一引数に置換元文字列(str)、第二引数に置換後文字列(str)を指定します。今回の例では第一引数に改行コード、第二引数にカンマを入れています。このようにreplaceを使うと直感的に置換することが可能です。
次に正しく置換できない例と、正しく置換する方法を紹介します。
string = "Taro\nJiro\r\nSaburo"
print(string.replace("\n", ",").replace("\r\n", ","))
# ,Saburoro
こちらのように、複数の改行コードが併用されている場合は正しく置換できないことがあります。どの改行コードを利用しているかわからない場合は、splitlines・joinを用いた方法を利用しましょう。
改行コードが分かっている場合は、以下のように記述することで正しく置換できます。
print(string.replace("\r\n", ",").replace("\n", ","))
# Taro,Jiro,Saburo
print(repr(string.replace("\r\n", ",").replace("\n", ",")))
# 'Taro,Jiro,Saburo'
はじめの例では、利用している改行コードに合わせて置換する順番を変えており、2つ目の例では、reprメソッドを利用しています。reprメソッドは改行コードなどの特殊文字を通常の文字列として出力するため、問題なく出力できます。
しかし、先ほども述べた通り、改行コードを置換する場合はsplitlines・joinメソッドを利用したほうが安心です。
5.改行コードの削除方法
ここからは改行コードの削除方法を紹介します。
先ほど紹介したsplitlines・joinを用いた方法でも削除できますが、ここではstripメソッドを利用した方法を見てみましょう。
string = "\nTaro,Jiro,Saburo\n"
print(string.strip())
# Taro,Jiro,Saburo
出力結果の通り、改行コードが削除できています。stripメソッドでは改行などの空文字を削除できます。