大量のデータを扱うCSVファイルを扱っていると、「一定の行数ごとに分割したい」「でもヘッダー行(ラベル行)は毎回入れたい」といったニーズがありますよね。
今回は、Pythonを使って「CSVファイルを指定行数ごとに分割し、各ファイルにヘッダー行も付けるスクリプト」をご紹介します。
このスクリプトでできること
- 任意のCSVファイルを、100行・500行など好きな行数単位で分割
- 各ファイルの1行目にヘッダー(ラベル)を追加
- Python標準の
csv
モジュールを使用(追加ライブラリ不要)
サンプルスクリプト
以下のコードを split_csv_with_header.py
という名前で保存し、Pythonで実行することで動作します。
import csv
import os
def split_csv(input_file, output_prefix, rows_per_file):
with open(input_file, 'r', newline='', encoding='utf-8') as csvfile:
reader = csv.reader(csvfile)
header = next(reader) # ラベル行(1行目)を取得
file_count = 1
rows = []
for i, row in enumerate(reader, start=1):
rows.append(row)
if i % rows_per_file == 0:
output_filename = f"{output_prefix}_{file_count}.csv"
with open(output_filename, 'w', newline='', encoding='utf-8') as outfile:
writer = csv.writer(outfile)
writer.writerow(header)
writer.writerows(rows)
print(f"{output_filename} を作成しました({len(rows)} 行)")
file_count += 1
rows = []
# 残りの行をファイルに書き出す(端数処理)
if rows:
output_filename = f"{output_prefix}_{file_count}.csv"
with open(output_filename, 'w', newline='', encoding='utf-8') as outfile:
writer = csv.writer(outfile)
writer.writerow(header)
writer.writerows(rows)
print(f"{output_filename} を作成しました({len(rows)} 行)")
# 実行例
if __name__ == "__main__":
split_csv('input.csv', 'output_part', 100)
解説ポイント
1. csv.reader を使ってCSVを読み込む
Python標準ライブラリの csv
モジュールを使うことで、CSVファイルを行単位で簡単に処理できます。
2. header = next(reader)
最初の1行を「ヘッダー行」として取り出し、分割後のすべてのファイルの先頭に書き込みます。
3. 行数でファイルを切り替え
100行など指定された行数ごとにファイルを分けて保存していきます。大量のCSVデータも分割して扱いやすくできます。
実行結果の例
例えば、input.csv
が300行(ヘッダー1行+299行)の内容だった場合:
python split_csv_with_header.py
と実行すると、以下のように出力されます:
output_part_1.csv
(ヘッダー+1〜100行目)output_part_2.csv
(ヘッダー+101〜200行目)output_part_3.csv
(ヘッダー+201〜299行目)
利用シーンの例
- 大量CSVをツールやアプリに分割して取り込むとき
- メールやフォームなどでアップロード制限があるとき
- 複数人に分担してデータをチェック・編集してもらいたいとき
まとめ
CSVファイルを手作業で分割するのは大変ですが、Pythonを使えばとてもシンプルに処理できます。
今回紹介したスクリプトを使えば、行数を決めて自動的に分割しつつ、ヘッダーも維持できるのでとても便利です。
CSVを扱う機会が多い方は、ぜひ一度使ってみてください。
コメント