【Python】PandasでCSV・TSVファイルを読み書きする方法(read_csv / to_csv)

データ分析の実務において、CSV(カンマ区切り)やTSV(タブ区切り)形式のテキストファイルはデータの交換フォーマットとして最も広く利用されています。Pandasには、これらのファイルを非常に簡単な記述でDataFrameとして読み込み、またDataFrameをファイルとして保存する機能が備わっています。

本記事では、read_csv 関数による柔軟なデータの読み込み方法と、to_csv メソッドによるファイル出力の制御について、具体的なコードを交えて解説します。

目次

CSV・TSVファイルの読み込み (read_csv)

Pandasの pd.read_csv() は、ローカルファイルやURLからデータを読み込むための関数です。デフォルトではカンマ区切りのファイルを想定していますが、引数を変更することでタブ区切り(TSV)やヘッダーのないファイルにも対応可能です。

主要な引数

  • filepath_or_buffer: ファイルパスまたはURL。
  • sep: 区切り文字。デフォルトはカンマ ,。TSVの場合は \t を指定します。
  • header: ヘッダー行の位置。ヘッダーがない場合は None を指定します。
  • dtype: 列ごとのデータ型を辞書で指定します。メモリの節約や型の誤認を防ぐために有効です。

CSV・TSVファイルへの書き込み (to_csv)

DataFrameの内容をファイルに保存するには df.to_csv() メソッドを使用します。

主要な引数

  • path_or_buf: 出力先のファイルパス。
  • index: 行ラベル(インデックス)をファイルに出力するかどうか。False にするとインデックス列が削除されます。
  • sep: 区切り文字。
  • index_label: インデックスを出力する場合の列名を指定します。

実装サンプルコード

以下のコードでは、まず動作確認用のダミーCSVファイルを作成し、それを様々な設定で読み込む手順を示します。その後、加工したデータを別の形式でファイルに出力します。

ここでは、あるシステムの「ユーザーアクセスログ」を題材としています。

import pandas as pd
import numpy as np
import os

def process_log_data():
    """
    CSV/TSVファイルの読み書き(入出力)を実演する関数
    """
    
    # ---------------------------------------------------------
    # 1. 準備: 動作確認用のサンプルファイルを作成
    # ---------------------------------------------------------
    csv_filename = "sample_access_log.csv"
    tsv_filename = "sample_no_header.tsv"

    # 標準的なCSVデータ(ヘッダーあり)
    csv_content = """user_id,access_time,response_time
1001,2026-05-01 10:00:00,0.45
1002,2026-05-01 10:05:00,1.20
1003,2026-05-01 10:10:00,0.08"""

    # TSVデータ(ヘッダーなし、タブ区切り)
    tsv_content = "2001\tLogin_Success\n2002\tLogin_Failed\n2003\tLogout"

    with open(csv_filename, "w", encoding="utf-8") as f:
        f.write(csv_content)
    
    with open(tsv_filename, "w", encoding="utf-8") as f:
        f.write(tsv_content)

    print(f"--- 準備完了: {csv_filename}, {tsv_filename} を作成しました ---\n")


    # ---------------------------------------------------------
    # 2. ファイルの読み込み (read_csv)
    # ---------------------------------------------------------
    print("=== CSVファイルの読み込み ===")
    # 基本的な読み込み(型指定あり)
    # user_idは整数、response_timeは浮動小数点数として読み込む
    df_csv = pd.read_csv(
        csv_filename,
        dtype={
            "user_id": np.int64,
            "response_time": np.float64
        }
    )
    print(df_csv)
    print(f"dtypes:\n{df_csv.dtypes}\n")

    print("=== TSVファイルの読み込み(ヘッダーなし) ===")
    # sep="\t" でタブ区切りを指定
    # header=None でヘッダー行がないことを明示
    # names引数で列名を後付けで付与
    df_tsv = pd.read_csv(
        tsv_filename,
        sep="\t",
        header=None,
        names=["session_id", "action_type"]
    )
    print(df_tsv)
    print("\n")


    # ---------------------------------------------------------
    # 3. ファイルへの書き込み (to_csv)
    # ---------------------------------------------------------
    print("=== CSVファイルへの出力 ===")
    output_csv = "processed_log.csv"
    
    # index=False にすることで、Pandasの行番号(0, 1, 2...)を出力しない
    df_csv.to_csv(output_csv, index=False)
    print(f"保存完了: {output_csv} (インデックスなし)")

    print("=== TSVファイルへの出力 ===")
    output_tsv = "processed_log.tsv"
    
    # sep="\t" でTSV形式として保存
    # index=True でインデックスも保存し、index_labelでその列名を設定
    df_tsv.to_csv(
        output_tsv,
        sep="\t",
        index=True,
        index_label="row_number"
    )
    print(f"保存完了: {output_tsv} (インデックスあり, ラベル='row_number')")

    # (参考) 作成したファイルを削除する場合は以下を有効化してください
    # os.remove(csv_filename)
    # os.remove(tsv_filename)
    # os.remove(output_csv)
    # os.remove(output_tsv)

if __name__ == "__main__":
    process_log_data()

実行結果

--- 準備完了: sample_access_log.csv, sample_no_header.tsv を作成しました ---

=== CSVファイルの読み込み ===
   user_id          access_time  response_time
0     1001  2026-05-01 10:00:00           0.45
1     1002  2026-05-01 10:05:00           1.20
2     1003  2026-05-01 10:10:00           0.08
dtypes:
user_id            int64
access_time       object
response_time    float64
dtype: object

=== TSVファイルの読み込み(ヘッダーなし) ===
   session_id   action_type
0        2001  Login_Success
1        2002  Login_Failed 
2        2003        Logout


=== CSVファイルへの出力 ===
保存完了: processed_log.csv (インデックスなし)
=== TSVファイルへの出力 ===
保存完了: processed_log.tsv (インデックスあり, ラベル='row_number')

注意点と補足

  • 区切り文字: CSV以外(タブやパイプ | など)を扱う場合は必ず sep 引数を指定してください。
  • インデックスの出力: to_csv のデフォルトは index=True です。不要な行番号が保存されるのを防ぐため、一般的なデータ保存では index=False を指定することが推奨されます。
  • エンコーディング: 日本語を含むファイルを扱う場合、Windows環境などでは encoding="utf-8"encoding="cp932" (Shift-JIS) を明示的に指定する必要がある場合があります(例: pd.read_csv("file.csv", encoding="utf-8"))。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次