データの取得・分析・保存をくり返すなら、ファイルの読み書きは必須の道具です。本記事では Python 標準ライブラリの csv と json を使って、株価データを読み書きする基本作法を整理します。
目次
- CSV と JSON の使い分け
- with open の作法
- CSV を書き込む
- CSV を読み込む(基本)
- DictReader / DictWriter — ヘッダ付きで扱う
- JSON を書き込む
- JSON を読み込む
- CSV から JSON に変換する
- pathlib でパスを扱う
- 文字コードの落とし穴
CSV と JSON の使い分け
両方とも軽量なテキスト形式ですが、適した用途が異なります。
| 形式 | 形 | 向いている用途 |
|---|---|---|
| CSV | 行と列の表 | 株価の時系列、銘柄一覧など表形式のデータ |
| JSON | キーと値の入れ子構造 | API レスポンス、設定ファイルなど階層のあるデータ |
J-Quants API のレスポンスは JSON で返り、それを整形して CSV に保存する流れがよくあります。
with open の作法
ファイルを開いたら、必ず閉じる必要があります。with 文を使うと、ブロックを抜けるときに自動で閉じてくれます。
with open("data.txt", "w", encoding="utf-8") as f: f.write("hello\n")
with open("data.txt", "r", encoding="utf-8") as f: text = f.read()print(text) # helloポイントは次のとおりです。
- 第 2 引数の モード:
"r"読み取り /"w"書き込み(上書き) /"a"追記 encoding="utf-8"を 明示的に指定(日本語の文字化けを防ぐ)withを使うと例外時もファイルが閉じられる
CSV を書き込む
csv モジュールを使います。csv.writer は行を 1 つずつ書き出します。
import csv
rows = [ ["Date", "Code", "C"], ["2026-04-01", "7203", 2900], ["2026-04-02", "7203", 2925], ["2026-04-03", "7203", 2880],]
with open("stocks.csv", "w", encoding="utf-8", newline="") as f: writer = csv.writer(f) writer.writerows(rows)newline="" は CSV を書くときの定石 です。指定しないと OS によっては余分な改行が入ります。
CSV を読み込む(基本)
csv.reader で 1 行ずつリストとして読み込めます。
import csv
with open("stocks.csv", "r", encoding="utf-8") as f: reader = csv.reader(f) rows = list(reader)
for row in rows: print(row)['Date', 'Code', 'C']['2026-04-01', '7203', '2900']['2026-04-02', '7203', '2925']['2026-04-03', '7203', '2880']csv.reader が返す値は 常に文字列 です。数値として扱うには int(...) や float(...) で変換します。
DictReader / DictWriter — ヘッダ付きで扱う
ヘッダ行をキーとして辞書で扱える書き方もあります。列が多くなるほど読みやすくなります。
import csv
records = [ {"Date": "2026-04-01", "Code": "7203", "C": 2900}, {"Date": "2026-04-02", "Code": "7203", "C": 2925},]
with open("stocks.csv", "w", encoding="utf-8", newline="") as f: writer = csv.DictWriter(f, fieldnames=["Date", "Code", "C"]) writer.writeheader() writer.writerows(records)
with open("stocks.csv", "r", encoding="utf-8") as f: reader = csv.DictReader(f) for row in reader: print(row["Date"], row["Code"], row["C"])「列の名前」で取り出せると、列の順番が変わってもコードが壊れにくくなります。
JSON を書き込む
json モジュールを使います。Python の辞書・リストをそのまま JSON に変換できます。
import json
data = { "Code": "7203", "CoName": "トヨタ自動車", "prices": [2900, 2925, 2880],}
with open("stock.json", "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=2)ポイントは次の 2 つです。
ensure_ascii=False: 日本語をそのまま出力する(指定しないとトのようなエスケープになる)indent=2: 人が読みやすいよう整形する
JSON を読み込む
json.load でファイルから直接辞書に戻せます。
import json
with open("stock.json", "r", encoding="utf-8") as f: data = json.load(f)
print(data["Code"]) # 7203print(data["prices"][0]) # 2900API のレスポンスを文字列として受け取る場合は json.loads(text) を使います(末尾の s は string)。
CSV から JSON に変換する
実例として、CSV を読み込んで JSON に書き直す処理です。
import csvimport json
records = []with open("stocks.csv", "r", encoding="utf-8") as f: reader = csv.DictReader(f) for row in reader: records.append({ "Date": row["Date"], "Code": row["Code"], "C": int(row["C"]), })
with open("stocks.json", "w", encoding="utf-8") as f: json.dump(records, f, ensure_ascii=False, indent=2)int(row["C"]) の変換を忘れると、JSON 上でも数値が文字列のままになります。
pathlib でパスを扱う
文字列でパスを書くより、pathlib.Path を使うほうが安全です。
from pathlib import Path
data_dir = Path("data")data_dir.mkdir(exist_ok=True) # ディレクトリを作る(既存なら何もしない)
csv_path = data_dir / "stocks.csv" # パスの連結print(csv_path.exists()) # ファイルがあるか確認OS による区切り文字の違い(/ と \)を吸収してくれます。
文字コードの落とし穴
Excel が出力する CSV は、Windows 環境で CP932(Shift_JIS の派生) で書かれることがあります。encoding="utf-8" で読むと文字化けする場合は、encoding="cp932" を試します。
with open("legacy.csv", "r", encoding="cp932") as f: reader = csv.reader(f) for row in reader: print(row)逆に、自分が書き出すファイルは UTF-8 で統一するのが望ましい運用です。
生成AI へのプロンプト例
ファイル変換の処理を生成AI に依頼する例です。
Python 3.12 標準ライブラリのみで、次の処理を書いてください。
入力: stocks.csv (列: Date, Code, C)出力: stocks.json (銘柄ごとに集約)
形式:[ { "Code": "7203", "prices": [ {"Date": "2026-04-01", "C": 2900}, ... ] }, ...]
要件:- Date は文字列のまま、C は整数に変換- 出力は ensure_ascii=False, indent=2- ファイル open には with と pathlib を使う入出力フォーマットを明示すると、想定どおりのコードが返ります(#7-2「データ分析のためのプロンプト設計」)。
まとめ
- ファイルは
with open(...)で開き、encoding="utf-8"を明示する - CSV は
csv.writer/csv.reader、ヘッダ付きならDictWriter/DictReader - JSON は
json.dump/json.load、日本語はensure_ascii=False - パス操作には
pathlib.Pathを使うと OS の差を吸収できる