データの取得・分析・保存をくり返すなら、ファイルの読み書きは必須の道具です。本記事では Python 標準ライブラリの csvjson を使って、株価データを読み書きする基本作法を整理します。

目次

  1. CSV と JSON の使い分け
  2. with open の作法
  3. CSV を書き込む
  4. CSV を読み込む(基本)
  5. DictReader / DictWriter — ヘッダ付きで扱う
  6. JSON を書き込む
  7. JSON を読み込む
  8. CSV から JSON に変換する
  9. pathlib でパスを扱う
  10. 文字コードの落とし穴

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"]) # 7203
print(data["prices"][0]) # 2900

API のレスポンスを文字列として受け取る場合は json.loads(text) を使います(末尾の s は string)。

CSV から JSON に変換する

実例として、CSV を読み込んで JSON に書き直す処理です。

import csv
import 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 の差を吸収できる