付録

CSVファイルの入出力

CSVファイルの構造name,age,city太郎,25,東京花子,30,大阪← ヘッダ行← データ行

CSVファイルとは

CSV(Comma-Separated Values)は、データをカンマで区切ったテキスト形式のファイルです。スプレッドシートや他のプログラムとのデータ交換によく使われます。

名前,年齢,点数
田中,25,85
鈴木,30,92
佐藤,28,78

csv モジュール

Pythonの標準ライブラリ csv を使ってCSVを読み書きできます。

CSVの読み込み

python
import csvwith open("data.csv", "r", encoding="utf-8", newline="") as f:    reader = csv.reader(f)    header = next(reader)  # ヘッダー行を取得    print("ヘッダー:", header)        for row in reader:        print(row)   # ['田中', '25', '85']

DictReader(辞書として読み込む)

python
import csvwith open("data.csv", "r", encoding="utf-8", newline="") as f:    reader = csv.DictReader(f)    for row in reader:        # row は OrderedDict        print(f"{row['名前']}: {row['点数']}点")

CSVの書き込み

python
import csvdata = [    ["名前", "年齢", "点数"],    ["田中", 25, 85],    ["鈴木", 30, 92],    ["佐藤", 28, 78],]with open("output.csv", "w", encoding="utf-8", newline="") as f:    writer = csv.writer(f)    writer.writerows(data)   # 複数行をまとめて書き込む

DictWriter(辞書として書き込む)

python
import csvfieldnames = ["名前", "年齢", "点数"]rows = [    {"名前": "田中", "年齢": 25, "点数": 85},    {"名前": "鈴木", "年齢": 30, "点数": 92},]with open("output.csv", "w", encoding="utf-8", newline="") as f:    writer = csv.DictWriter(f, fieldnames=fieldnames)    writer.writeheader()     # ヘッダーを書き込む    writer.writerows(rows)   # データを書き込む

pandas を使ったCSV操作

実際のデータ分析では、pandasを使うのが最も一般的です。

CSVの読み込み

python
import pandas as pd# 基本的な読み込みdf = pd.read_csv("data.csv", encoding="utf-8")# よく使うオプションdf = pd.read_csv("data.csv",    encoding="utf-8",         # エンコーディング    index_col=0,              # インデックスにする列    header=0,                 # ヘッダー行のインデックス    skiprows=1,               # 先頭1行をスキップ    usecols=["名前", "点数"],  # 必要な列のみ読む    dtype={"年齢": int},       # データ型を指定    na_values=["N/A", ""],    # 欠損値としてとみなす値)print(df.head())   # 先頭5行を確認print(df.info())

CSVへの書き込み

python
import pandas as pddf = pd.DataFrame({    "名前": ["田中", "鈴木", "佐藤"],    "年齢": [25, 30, 28],    "点数": [85, 92, 78],})# CSVへの保存df.to_csv("output.csv", encoding="utf-8", index=False)# index=True にするとインデックスも保存される

文字コードの問題

Windowsで作成されたCSVはShift-JISエンコードの場合があります。

python
# Shift-JISの場合df = pd.read_csv("windows_data.csv", encoding="shift-jis")df = pd.read_csv("windows_data.csv", encoding="cp932")  # Windows特有の文字も対応# Excel用(BOM付きUTF-8)df.to_csv("for_excel.csv", encoding="utf-8-sig")  # ExcelでUTF-8を正しく開くため

練習: CSVファイルの操作

基礎

CSV形式のデータを作成し、学生名と点数を保存・読み込みして平均点を求めてください。