Pythonでプログラミングをしていると、文字列やファイルに含まれる「改行コード」の扱いに悩まされることもあるでしょう。
「文字列の見た目を整えたいのに、改行が邪魔になる」
このような問題は、特に初心者の方がつまずきやすいポイントです。
この記事では、Pythonで改行コードを削除したり、別の文字に置換したりするための基本的な方法から、ファイル操作などの発展的なテクニックまで、徹底的に解説します。
【本記事の信頼性】
- 執筆者は元エンジニア
- 大手プログラミングスクールのWebディレクター兼ライターを経験
- 自らも地元密着型のプログラミングスクールを運営
プログラミングスクール
■Webエンジニアの育成に特化 ■自社開発企業への転職成功率がダントツ ■ハイスキルを求める人に最適 |
|
■サポートは半永久的 ■単価80万円以上の講師陣 ■AWSやJavaに強い |
|
■受講料完全無料 ■最短1か月で卒業 ■教室への通学も可能 |
Pythonにおける改行コードとは?
そもそも改行コードとは、コンピュータに対して「ここで文章を改行してください」と指示するための、目には見えない特殊な文字のことです。
私たちが普段キーボードのEnterキーを押すと、この改行コードがテキストに入力されています。
しかし、この改行コードは1種類ではありません。
主に使われているOSによって、使われる改行コードが異なるという特徴があります。
- LF (
\n
): LinuxやmacOSで使われる改行コード - CRLF (
\r\n
): Windowsで使われる改行コード
Pythonでファイルからデータを読み込んだり、Webから情報を取得したりすると、これらの意図しない改行コードが含まれていることがよくあります。
データを正しく処理したり、比較したりするためには、これらの不要な改行コードを適切に削除・置換する作業が非常に重要になるというわけです。
Pythonで改行コードを削除・置換する3つの方法
それでは、具体的にPythonで改行コードを削除・置換する基本的な3つの方法を見ていきましょう。
それぞれのメソッドに特徴があるので、目的に合わせて使い分けることが大切です。
replace():文字列中のすべての改行を削除・置換
replace()
は、文字列中に含まれる特定の文字を、すべて別の文字に置き換えるためのメソッドです。
改行コードを完全に削除したり、スペースなどの別の文字に変換したりする際に非常に便利でしょう。
【改行コードを削除するサンプルコード】
text = 'これは1行目です。\nこれは2行目です。\nそして3行目。'
cleaned_text = text.replace('\n', '')
【実行結果】
このコードでは、文字列text
に含まれるすべての改行コード\n
を、空の文字列''
に置換しています。
その結果、すべての行が連結された1つの文字列が生成されました。
文字列の途中にある改行もすべて削除したい場合に最適な方法です。
【改行コードをスペースに置換するサンプルコード】
text = 'これは1行目です。\nこれは2行目です。\nそして3行目。'
spaced_text = text.replace('\n', ' ')
【実行結果】
今度は、改行コード\n
を半角スペース' '
に置き換えてみました。
このようにreplace()
を使えば、削除だけでなく、任意の文字への置換も簡単に行えます。
strip():文字列の前後にある改行を削除
strip()
は、文字列の先頭と末尾にある改行コードや空白文字(スペース、タブなど)を削除するメソッドです。
文字列の途中にある改行は削除されない点に注意してください。
特にファイルから1行ずつデータを読み込む際、行の末尾に不要な改行コードが付いていることが多いため、このstrip()
が活躍します。
strip()
には3つの種類があります。
strip()
: 文字列の両端にある改行・空白を削除します。rstrip()
: 文字列の末尾(右側)にある改行・空白を削除します。lstrip()
: 文字列の先頭(左側)にある改行・空白を削除します。
【rstrip()
で末尾の改行を削除するサンプルコード】
line_from_file = 'ファイルから読み込んだ行\n'
cleaned_line = line_from_file.rstrip()
【実行結果】
‘
この例では、rstrip()
を使って文字列の末尾にある改行コード\n
をきれいに削除できました。
ファイル処理ではこのrstrip()
が最もよく使われるので、ぜひ覚えておきましょう。
【strip()
で前後の改行を削除するサンプルコード】
text = '\n\n 前後に改行と空白がある文字列 \n\n'
cleaned_text = text.strip()
【実行結果】
元の文字列:'
前後に改行と空白がある文字列
'
処理後の文字列: '前後に改行と空白がある文字列'
strip()
を使うと、文字列の前後にある改行コードと空白文字がすべて削除されているのがわかります。
splitlines():改行で分割して実質的に削除
splitlines()
は、改行コードを区切りとして文字列を分割し、各行を要素とするリストを返すメソッドです。
このメソッドの特徴は、返されるリストの各要素に改行コードが含まれない点です。
そのため、結果的に改行コードを削除し、行ごとに分割されたデータが欲しい場合に非常に有効でしょう。
【splitlines()
のサンプルコード】
multiline_text = 'これは1行目です。\nこれはWindowsの改行\r\nそして3行目。'
lines = multiline_text.splitlines()
【実行結果】
['これは1行目です。', 'これはWindowsの改行', 'そして3行目。']
このコードを見ると、\n
と\r\n
という2種類の改行コードが混在していても、splitlines()
がそれらを正しく認識し、改行コードを含まない行のリストを作成していることがわかります。
複数の改行コードを一度に扱いたい場合に便利なメソッドです。
【発展編】ファイルやリストの改行コードを一括で削除する方法
ここからは少し発展的な内容として、ファイルやリストに含まれる改行コードを効率的に扱う方法を紹介します。
実際のデータ処理では、こちらを使う場面の方が多いかもしれません。
ファイルを1行ずつ読み込んで改行を削除する
ファイルの内容を処理する際、最も安全でメモリ効率が良い方法は、ファイルを1行ずつ読み込んで処理することです。
この方法なら、どんなに巨大なファイルであってもメモリを圧迫する心配がありません。
for
ループと、先ほど紹介したrstrip()
を組み合わせるのが定番のやり方になります。
以下のサンプルコードは、sample.txt
というファイルに次の3行が書かれていることを前提としています。
1行目です。
2行目です。
3行目です。
lines_without_newline = []
with open('sample.txt', 'r', encoding='utf-8') as f:
for line in f:
lines_without_newline.append(line.rstrip())
【実行結果】
['1行目です。', '2行目です。', '3行目です。']
このコードは、with
構文で安全にファイルを開き、for
ループで1行ずつline
という変数に取り出しています。
そして、line.rstrip()
で行末の改行コードを削除したものを、新しいリストlines_without_newline
に追加していく、という流れです。
この処理は「リスト内包表記」を使うと、さらに短く書くこともできます。
【リスト内包表記を使ったサンプルコード】
with open('sample.txt', 'r', encoding='utf-8') as f:
lines = [line.rstrip() for line in f]
こちらの書き方でも、実行結果はまったく同じになります。
よりPythonらしいスマートな記述と言えるでしょう。
readlines()で読み込んだリストの改行を削除する
readlines()
は、ファイルのすべての行を読み込み、各行を要素とするリストを返すメソッドです。
ただし、このメソッドが返すリストの各要素には、末尾に改行コードが含まれたままなので注意が必要です。
そのため、readlines()
を使った後には、リストの各要素から改行コードを削除する処理が必要になります。
【サンプルコード】
with open('sample.txt', 'r', encoding='utf-8') as f:
lines_with_newline = f.readlines()
print(f"読み込み直後のリスト: {lines_with_newline}")
lines_without_newline = [line.rstrip() for line in lines_with_newline]
【実行結果】
実行結果を見ると、readlines()
で読み込んだ直後のリストには\n
が含まれていますが、その後の処理で綺麗に削除できているのがわかります。
read()で一括読み込みしてreplace()で削除・置換する
read()
は、ファイルの内容をすべて読み込み、1つの巨大な文字列として返すメソッドです。
ファイル全体が1つの文字列になるため、あとはreplace()
を使えばファイル内のすべての改行コードを一括で削除・置換できます。
# read()で一括処理
def process_entire_file(filename):
with open(filename, 'r', encoding='utf-8') as f:
content = f.read()
print("元のファイル内容:", repr(content))
# すべての改行を削除
no_newlines = content.replace('\n', '')
print("改行削除:", repr(no_newlines))
# 改行をスペースに置換
with_spaces = content.replace('\n', ' ')
print("スペース置換:", repr(with_spaces))
# 改行をカンマに置換
with_commas = content.replace('\n', ', ')
print("カンマ置換:", repr(with_commas))
return no_newlines, with_spaces, with_commas
no_nl, with_sp, with_com = process_entire_file('sample.txt')
# 出力:
# 元のファイル内容:'東京都\n大阪府\n愛知県\n福岡県\n'
# 改行削除:'東京都大阪府愛知県福岡県'
# スペース置換:'東京都 大阪府 愛知県 福岡県 '
# カンマ置換:'東京都, 大阪府, 愛知県, 福岡県, '
この方法では、ファイル全体が1つの文字列として扱われるため、改行の位置や数を気にせずに一括処理ができます。
末尾の不要な区切り文字を削除したい場合は以下のような工夫が可能です:
# 末尾の不要な文字を削除する工夫
def clean_file_content(filename):
with open(filename, 'r', encoding='utf-8') as f:
content = f.read().strip() # 最初に前後の改行を削除
# 改行をカンマに置換
with_commas = content.replace('\n', ', ')
return with_commas
result = clean_file_content('sample.txt')
print("きれいな結果:", result)
# 出力:きれいな結果:東京都, 大阪府, 愛知県, 福岡県
この方法はコードがシンプルで非常に手軽です。
しかし、数GBにもなるような巨大なファイルを読み込むと、メモリを大量に消費してしまい、プログラムが停止する原因にもなりかねません。
比較的小さなファイルを扱う場合に限定して使うのがよいでしょう。
より高度な改行コードの削除テクニック
基本的な方法に加え、より複雑な状況やパフォーマンスが求められる場面で役立つ、高度なテクニックも存在します。
正規表現(re.sub)を使って複数の改行コードをまとめて削除
ファイルの作成元が異なると、\n
(LF) と \r\n
(CRLF) といった異なる種類の改行コードが混在してしまうことがあります。
このような場合、replace()
を何度も呼び出すのは非効率です。
そこで活躍するのが正規表現です。
正規表現を使えば、さまざまなパターンの文字列を一度に検索・置換できます。
Pythonで正規表現を扱うには、re
モジュールをインポートしてre.sub()
関数を使いましょう。
以下のコードでは、\n
と\r\n
が混在した文字列から、両方の改行コードを一度に削除しています。
【サンプルコード】
import re
mixed_text = 'LFの改行\nCRLFの改行\r\n'
cleaned_text = re.sub(r'\r\n|\n|\r', '', mixed_text)
【実行結果】
LFの改行CRLFの改行
re.sub(r'\r\n|\n|\r', '', mixed_text)
の部分が正規表現による置換処理です。
r'\r\n|\n|\r'
というパターンは、「\r\n
または\n
または\r
のいずれかに一致する」という意味になります。
これにより、どの種類の改行コードであっても、すべて空文字列に置換することが可能です。
translate()を使って高速に削除
translate()
は、大量のテキストデータから特定の文字を削除する場合に、replace()
よりも高速に動作することが期待できるメソッドです。
パフォーマンスを重視する場面で、選択肢の一つとして覚えておくと役立つかもしれません。str.maketrans()
と組み合わせて使うのが一般的です。
【サンプルコード】
chars_to_remove = '\n\r'
translation_table = str.maketrans('', '', chars_to_remove)
text = 'たくさんの\n改行が\n含まれる\n文字列\r\nです。'
fast_cleaned_text = text.translate(translation_table)
【実行結果】
たくさんの改行が含まれる文字列です。
まずstr.maketrans('', '', '\n\r')
で、削除したい文字(\n
と\r
)を指定した変換テーブルを作成します。
そして、そのテーブルをtranslate()
メソッドに渡すことで、指定された文字が効率的に削除される、という仕組みです。
Pythonで改行コードを削除・置換する際のFAQ
最後に、初心者の方が陥りがちな疑問やエラーについて、Q&A形式で解説します。
replace()を実行したのに改行コードを削除できない
これは非常によくある間違いで、replace()
を実行したのに、元の文字列から改行が消えていない、という状況に陥ることがあります。
Pythonの文字列は「不変(immutable)」という性質を持っています。
これは、一度作成した文字列オブジェクトの中身を直接変更できない、という意味です。
replace()
メソッドは元の文字列を変更するのではなく、変更後の新しい文字列を返す仕様になっています。
解決策としては、replace()
が返した新しい文字列を、変数に代入し直す、というやり方があります。
【誤ったコード例】
text = '改行を\n消したい'
text.replace('\n', '')
print(text)
【実行結果】
改行を 消したい
【正しいコード例】
text = '改行を\n消したい'
text = text.replace('\n', '')
print(text)
【実行結果】
改行を消したい
このように、メソッドの実行結果をしっかり変数で受け止めることを忘れないでください。
strip()を使ったら改行だけでなくスペースも消えてしまった
strip()
を使ったら、消したくないはずの先頭や末尾のスペースまで消えてしまった、というのもよくあるケースです。
strip()
メソッドは、引数を指定しない場合、改行コード、半角スペース、全角スペース、タブなど、すべての空白文字を削除対象とします。
したがって、削除したい文字を引数で明示的に指定しましょう。
改行コードだけを削除したい場合は、strip('\n')
のように書きます。
【サンプルコード】
text_with_space = ' 先頭にスペースと末尾に改行\n'
cleaned_all = text_with_space.strip()
print(f"引数なし: '{cleaned_all}'")
【実行結果】
引数なし: '先頭にスペースと末尾に改行' 引数あり: ' 先頭にスペースと末尾に改行'
実行結果から、strip('\n')
と指定することで、先頭のスペースは残したまま、末尾の改行だけを削除できているのがわかります。rstrip()
やlstrip()
でも同様に引数を指定可能です。
まとめ
今回は、Pythonで改行コードを削除・置換するための様々な方法を解説しました。
なお、Pythonを体系的に学んだり、Pythonのスキルを高めたりするためには、プログラミングスクールを利用するのも有効です。
細かな疑問がすぐに解決するだけでなく、現役エンジニアが「質の高いポートフォリオ」を作成するための手助けをしてくれたり、エンジニア就職・転職のコツを教えてくれたりするなど、様々なメリットがありますので、独学に疲れた方は検討してみてはいかがでしょうか。
