スプレッドシートをエクスポートしたのに、パイプラインの次のツールがJSONを求めていることがある。pandasを読み込むのは大げさ——Pythonの標準ライブラリだけで十分だ。サードパーティパッケージ不要で、わずかな行数で実現する小さなコンバーターを紹介する。
1. CSVの読み込み
csv.DictReaderはヘッダ行をキーとする辞書に各行を自動変換する。手動でのヘッダ解析は不要。
import csv
def read_csv(csv_path):
with open(csv_path, newline="", encoding="utf-8") as f:
reader = csv.DictReader(f)return list(reader)
Enter fullscreen mode Exit fullscreen mode
結果をlist()でラップすることでリーダーを前もってすべて消費する。小〜中規模ファイルなら問題なく、後で遅延反復するより遥かに理解しやすい。
2. JSONの書き込み
import json
def write_json(rows, json_path):
with open(json_path, "w", encoding="utf-8") as f:
json.dump(rows, f, indent=2)
Enter fullscreen mode Exit fullscreen mode
indent=2は出力を人間が読みやすく保つ。誰かがファイルを開いて内容を確認する場合に役立つ。
3. まとめる
def csv_to_json(csv_path, json_path):
rows = read_csv(csv_path)
write_json(rows, json_path)
return len(rows)
Enter fullscreen mode Exit fullscreen mode
行数を返すことで簡単な健全性チェックになる。500件の連絡先を想定していたのに3件しか返ってこなければ、ファイルを開く前に上流で問題が発生したことがわかる。
4. スクリプト全体
import csv
import json
def read_csv(csv_path):
with open(csv_path, newline="", encoding="utf-8") as f:
reader = csv.DictReader(f)
return list(reader)
def write_json(rows, json_path):
with open(json_path, "w", encoding="utf-8") as f:
json.dump(rows, f, indent=2)
def csv_to_json(csv_path, json_path):
rows = read_csv(csv_path)
write_json(rows, json_path)
return len(rows)
if __name__ == "__main__":
count = csv_to_json("contacts.csv", "contacts.json")
print(f"Converted {count} rows -> contacts.json")
Enter fullscreen mode Exit fullscreen mode
5. 試してみる
次のようなcontacts.csvがあるとする。
name,email,city
Alice,alice@example.com,Austin
Bob,bob@example.com,Denver
Enter fullscreen mode Exit fullscreen mode
スクリプトを実行すると次のJSONが出力される。
[
{
"name": "Alice",
"email": "[email protected]",
"city": "Austin"
},
{
"name": "Bob",
"email": "[email protected]",
"city": "Denver"
}
]
Enter fullscreen mode Exit fullscreen mode
まとめ
これは一般的なケースをカバーする:ヘッダ行が1行のクリーンで整ったCSV。エンコーディングの不整合、埋め込まれたカンマ、複数行フィールドなど、より複雑な実世界のファイルについては、Pythonのcsvモジュールが適切なクォート処理で大部分を正しく扱う。ただし非常に不規則なエクスポートには変換前に追加のクリーンアップが必要になる場合もある。それでも、スプレッドシートからAPIへの素早いパイプラインにはこれだけで十分なことが多い。
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.