外部ファイルから読み込んだテキストデータや、Webスクレイピングで取得した文字列には、しばしば不要な空白行が含まれています。データ処理の前段階として、これらの空行(または空白文字のみの行)を取り除き、データを整形したい場合があります。
Pythonでは、文字列操作メソッドとリスト内包表記を組み合わせることで、このクレンジング処理を簡潔に実装できます。ここでは、不規則な空行を含むテキストデータを整形するコード例を紹介します。
空白行削除のロジック
空白行を削除するための基本的なアプローチは以下の通りです。
- 行分割: テキスト全体を行ごとのリストに変換します。
- 判定と抽出: 各行に対して「空白文字を取り除いた結果、文字列が残るか」を判定し、条件を満たす行のみを抽出します。
- 再結合: 抽出した行を再び結合します。
実装例:住所録データの整形
以下のコードは、手動入力などで発生した不規則な空行を含む住所録データを、詰めて整形する例です。
def main():
# 不規則な空行や、スペースのみの行が含まれるテキストデータ
raw_address_data = """
Tokyo, Shinjuku
Osaka, Umeda
Nagoya, Sakae
Fukuoka, Hakata
"""
# 1. 文字列を行ごとに分割する
# splitlines() は改行コードの種類(\n, \r\n)を問わず適切に分割します
lines = raw_address_data.splitlines()
# 2. 空白行を除外して新しいリストを作成する
# line.strip() は文字列の前後の空白を除去します。
# 空白除去後に文字列が存在する場合(True)のみリストに残します。
clean_lines = [line for line in lines if line.strip()]
# 3. 整形された行を改行コードで結合する
formatted_text = "\n".join(clean_lines)
# 結果の出力
print("--- 整形前のデータ(確認用) ---")
print(f"'{raw_address_data}'")
print("\n--- 整形後のデータ ---")
print(formatted_text)
if __name__ == "__main__":
main()
コードの解説
line.strip() による判定 strip() メソッドは、文字列の先頭と末尾にある空白文字(スペース、タブ、改行など)をすべて削除します。
- 文字がある行:
" Tokyo "->"Tokyo"(Trueと評価される) - 空行またはスペースのみの行:
" "->""(Falseと評価される)
この性質を利用し、if line.strip(): と記述することで、実質的なデータが含まれていない行をフィルタリングできます。
splitlines() の利点 split('\n') を使用した場合、最終行に改行コードが含まれていると空文字列がリスト末尾に追加されるなど、意図しない挙動になることがあります。splitlines() はこれらの境界ケースを適切に処理するため、行単位の処理にはこちらが適しています。
この処理は、CSVファイルの読み込み前処理や、ユーザー入力テキストの正規化など、多くのテキスト処理タスクで役立ちます。
