背景
業務で100MBを超える巨大なCSVファイルの内容を確認する必要がありました。
しかし、ファイルサイズが大きすぎて次のような問題が発生しました。
- Numbersでは読み込み中に固まる
- Googleスプレッドシートはアップロードで容量制限に引っかかる
- テキストエディタで開いても重く、実質確認ができない
今回確認したかった内容は以下の2点だけでした。
- ヘッダ行(列名)を確認したい
- 先頭のいくつかのレコードを確認したい
そこで、ファイル全体を開くのではなく、必要な部分だけ切り出すアプローチを取ることにしました。
やったこと(解決策)
巨大CSVをそのまま扱うのは非効率なので、ヘッダ+先頭500行だけを抽出した別ファイルを作るスクリプトを作成しました。
これにより、
- NumbersやGoogleスプレッドシートでも問題なく開けるサイズにできる
- 文字コード(Shift_JIS / cp932)も安全に扱える
- 列構造・データの傾向を把握するには十分
というメリットがあります。
実際に使ったスクリプト
#!/usr/bin/env python3
import csv
from pathlib import Path
MAX_ROWS = 500 # 先頭何行を抜き出すか
# ★ここを実際のファイル名に変えてください
INPUT_FILE = "full.csv" # 元のCSVファイル名
OUTPUT_FILE = "sample.csv" # 出力するサンプルCSVファイル名
def main():
input_path = Path(INPUT_FILE)
output_path = Path(OUTPUT_FILE)
if not input_path.exists():
print(f"入力ファイルが見つかりません: {input_path.resolve()}")
return
# 日本語CSV(Shift_JIS系)想定 → cp932 で開く
with input_path.open("r", newline="", encoding="cp932") as fin, \
output_path.open("w", newline="", encoding="cp932") as fout:
reader = csv.reader(fin)
writer = csv.writer(fout)
# 1行目(ヘッダ)を書き出し
try:
header = next(reader)
except StopIteration:
print("入力ファイルにデータがありません。")
return
writer.writerow(header)
# データ部分から先頭 MAX_ROWS 行だけを書き出し
for i, row in enumerate(reader, start=1):
if i > MAX_ROWS:
break
writer.writerow(row)
print(f"ヘッダ+先頭{MAX_ROWS}行を {output_path.resolve()} に出力しました。" )
if __name__ == "__main__":
main()
まとめ
ちょっとしたTipsですが、同じ状況の方の参考になれば幸いです。