CSVファイルを扱ってみよう

学習の目標

本章では、以下の内容を学習します。

  • CSVファイルとは何かを理解する
  • Pythonでcsvモジュールを使う方法を学ぶ
  • CSVファイルからデータを読み込む方法を習得する
  • CSVファイルにデータを書き込む方法を理解する
  • 辞書形式でCSVデータを扱う方法を学ぶ

CSVファイルとは何か

CSVとは「Comma Separated Values」の略で、データをカンマ(,)で区切って保存するファイル形式です。 表計算ソフトのExcelや、データベースから出力されるデータでよく使われる形式です。

CSVファイルの例を見てみましょう。 以下のような内容がCSVファイルの典型的な形です。

名前,年齢,職業
田中太郎,25,エンジニア
佐藤花子,30,デザイナー
山田次郎,28,営業

1行目はヘッダー(項目名)、2行目以降が実際のデータになっています。 各列がカンマで区切られているため、プログラムで読み込んで処理しやすい形式になっています。

CSVファイルは、大量のデータを整理して保存したり、異なるシステム間でデータを交換したりする際によく使用されます。

CSVファイルを読み込むためのサンプルデータを作成

まずは、読み込み用のCSVファイルを準備しましょう。

VS Codeでstudents.csvというファイルを作成し、以下の内容を入力してください。

名前,数学,英語,国語
田中太郎,85,78,92
佐藤花子,92,88,85
山田次郎,76,82,79
鈴木美咲,88,95,91

このファイルには、生徒の名前と各教科の点数が記録されています。 1行目がヘッダー(項目名)で、2行目以降が各生徒のデータです。

ファイルを保存したら、次にPythonプログラムを作成していきます。

csvモジュールを使った基本的な読み込み

PythonでCSVファイルを扱うには、標準ライブラリのcsvモジュールを使用します。 このモジュールは最初からPythonに含まれているので、追加でインストールする必要はありません。

csv_read.pyというファイルを作成し、以下のコードを入力してみましょう。

import csv

# CSVファイルを読み込む
with open('students.csv', 'r', encoding='utf-8') as file:
    csv_reader = csv.reader(file)
    
    # 1行ずつ読み込んで表示
    for row in csv_reader:
        print(row)

このコードを実行してみましょう。

python csv_read.py

実行結果は以下のようになります。

['名前', '数学', '英語', '国語']
['田中太郎', '85', '78', '92']
['佐藤花子', '92', '88', '85']
['山田次郎', '76', '82', '79']
['鈴木美咲', '88', '95', '91']

csv.reader()を使うことで、CSVファイルの各行がリスト形式で読み込まれます。 1つ目のリストがヘッダー、2つ目以降が各行のデータになっています。

注意点として、数値も文字列として読み込まれているため、計算に使う場合は数値に変換する必要があります。

ヘッダーとデータを分けて処理する

ヘッダー行とデータ行を分けて処理すると、より読みやすいプログラムになります。

同じファイルに以下のコードを追加してみましょう。

import csv

# CSVファイルを読み込む
with open('students.csv', 'r', encoding='utf-8') as file:
    csv_reader = csv.reader(file)
    
    # 1行ずつ読み込んで表示
    for row in csv_reader:
        print(row)

print("=" * 30)

# ヘッダーとデータを分けて処理
with open('students.csv', 'r', encoding='utf-8') as file:
    csv_reader = csv.reader(file)
    
    # 最初の行(ヘッダー)を取得
    header = next(csv_reader)
    print("ヘッダー:", header)
    
    print("\n生徒データ:")
    # 残りの行(データ)を処理
    for row in csv_reader:
        name = row[0]
        math_score = int(row[1])  # 数学の点数を数値に変換
        english_score = int(row[2])  # 英語の点数を数値に変換
        japanese_score = int(row[3])  # 国語の点数を数値に変換
        
        # 平均点を計算
        average = (math_score + english_score + japanese_score) / 3
        
        print(f"{name}: 平均点 {average:.1f}点")

このコードを実行すると、以下のような結果が表示されます。

python csv_read.py
['名前', '数学', '英語', '国語']
['田中太郎', '85', '78', '92']
['佐藤花子', '92', '88', '85']
['山田次郎', '76', '82', '79']
['鈴木美咲', '88', '95', '91']
==============================
ヘッダー: ['名前', '数学', '英語', '国語']

生徒データ:
田中太郎: 平均点 85.0点
佐藤花子: 平均点 88.3点
山田次郎: 平均点 79.0点
鈴木美咲: 平均点 91.3点

next(csv_reader)を使うことで、最初の行だけを取得できます。 その後のforループでは、残りの行が順番に処理されます。

また、int()を使って文字列を数値に変換することで、計算ができるようになります。

CSVファイルにデータを書き込む

今度は、CSVファイルにデータを書き込む方法を学習しましょう。

csv_write.pyというファイルを作成し、以下のコードを入力してください。

import csv

# 新しいCSVファイルを作成
students_data = [
    ['名前', '年齢', '学年'],  # ヘッダー
    ['田中一郎', 16, 1],
    ['佐藤二郎', 17, 2],
    ['山田三郎', 18, 3]
]

with open('new_students.csv', 'w', newline='', encoding='utf-8') as file:
    csv_writer = csv.writer(file)
    
    # 全てのデータを一度に書き込み
    csv_writer.writerows(students_data)

print("新しいCSVファイルを作成しました")

このコードを実行してみましょう。

python csv_write.py

実行すると、以下のメッセージが表示されます。

新しいCSVファイルを作成しました

実行後、new_students.csvファイルが作成されます。 ファイルを開いて確認すると、以下のような内容になっています。

名前,年齢,学年
田中一郎,16,1
佐藤二郎,17,2
山田三郎,18,3

csv.writer()を使ってCSVファイルに書き込みます。 writerows()メソッドは、リストのリストを一度に書き込むことができます。

newline=''は、Windowsでの改行コードの問題を避けるために指定しています。

1行ずつデータを書き込む

データを1行ずつ書き込むこともできます。 同じファイルに以下のコードを追加してみましょう。

import csv

# 新しいCSVファイルを作成
students_data = [
    ['名前', '年齢', '学年'],  # ヘッダー
    ['田中一郎', 16, 1],
    ['佐藤二郎', 17, 2],
    ['山田三郎', 18, 3]
]

with open('new_students.csv', 'w', newline='', encoding='utf-8') as file:
    csv_writer = csv.writer(file)
    
    # 全てのデータを一度に書き込み
    csv_writer.writerows(students_data)

print("新しいCSVファイルを作成しました")

# 1行ずつ書き込む方法
with open('step_by_step.csv', 'w', newline='', encoding='utf-8') as file:
    csv_writer = csv.writer(file)
    
    # ヘッダーを書き込み
    csv_writer.writerow(['商品名', '価格', '在庫'])
    
    # データを1行ずつ書き込み
    csv_writer.writerow(['りんご', 150, 50])
    csv_writer.writerow(['バナナ', 200, 30])
    csv_writer.writerow(['オレンジ', 180, 25])

print("商品データCSVファイルを作成しました")

実行すると、step_by_step.csvファイルも作成されます。

python csv_write.py
新しいCSVファイルを作成しました
商品データCSVファイルを作成しました

step_by_step.csvファイルの中身は以下のようになります。

商品名,価格,在庫
りんご,150,50
バナナ,200,30
オレンジ,180,25

writerow()メソッドは1行ずつデータを書き込むため、動的にデータを追加する場合に便利です。

辞書形式でCSVデータを扱う

CSVファイルを辞書形式で扱うと、列名をキーとして使えるため、より読みやすいコードが書けます。

csv_dict.pyというファイルを作成し、以下のコードを入力してください。

import csv

# 辞書形式でCSVファイルを読み込む
with open('students.csv', 'r', encoding='utf-8') as file:
    csv_reader = csv.DictReader(file)
    
    print("辞書形式でのデータ読み込み:")
    for row in csv_reader:
        print(row)

このコードを実行してみましょう。

python csv_dict.py

実行結果は以下のようになります。

辞書形式でのデータ読み込み:
{'名前': '田中太郎', '数学': '85', '英語': '78', '国語': '92'}
{'名前': '佐藤花子', '数学': '92', '英語': '88', '国語': '85'}
{'名前': '山田次郎', '数学': '76', '英語': '82', '国語': '79'}
{'名前': '鈴木美咲', '数学': '88', '英語': '95', '国語': '91'}

csv.DictReader()を使うと、各行が辞書形式で読み込まれます。 ヘッダーが辞書のキーになるため、列名を使ってデータにアクセスできます。

同じファイルに以下のコードを追加して、より実用的な例を見てみましょう。

import csv

# 辞書形式でCSVファイルを読み込む
with open('students.csv', 'r', encoding='utf-8') as file:
    csv_reader = csv.DictReader(file)
    
    print("辞書形式でのデータ読み込み:")
    for row in csv_reader:
        print(row)

print("=" * 40)

# 辞書形式を使った成績処理
with open('students.csv', 'r', encoding='utf-8') as file:
    csv_reader = csv.DictReader(file)
    
    print("成績一覧:")
    for student in csv_reader:
        name = student['名前']
        math = int(student['数学'])
        english = int(student['英語'])
        japanese = int(student['国語'])
        
        total = math + english + japanese
        average = total / 3
        
        print(f"{name}: 合計{total}点, 平均{average:.1f}点")

実行すると、以下のような結果が表示されます。

python csv_dict.py
辞書形式でのデータ読み込み:
{'名前': '田中太郎', '数学': '85', '英語': '78', '国語': '92'}
{'名前': '佐藤花子', '数学': '92', '英語': '88', '国語': '85'}
{'名前': '山田次郎', '数学': '76', '英語': '82', '国語': '79'}
{'名前': '鈴木美咲', '数学': '88', '英語': '95', '国語': '91'}
========================================
成績一覧:
田中太郎: 合計255点, 平均85.0点
佐藤花子: 合計265点, 平均88.3点
山田次郎: 合計237点, 平均79.0点
鈴木美咲: 合計274点, 平均91.3点

辞書形式を使うことで、student['名前']のように列名でデータにアクセスできるため、コードの意味が分かりやすくなります。

辞書形式でCSVファイルに書き込む

辞書形式でCSVファイルに書き込むこともできます。

csv_dict_write.pyというファイルを作成し、以下のコードを入力してください。

import csv

# 辞書形式のデータを準備
employees = [
    {'名前': '田中太郎', '部署': '開発', '給与': 400000},
    {'名前': '佐藤花子', '部署': 'デザイン', '給与': 380000},
    {'名前': '山田次郎', '部署': '営業', '給与': 350000}
]

# 辞書形式でCSVファイルに書き込み
with open('employees.csv', 'w', newline='', encoding='utf-8') as file:
    # ヘッダーを指定
    fieldnames = ['名前', '部署', '給与']
    csv_writer = csv.DictWriter(file, fieldnames=fieldnames)
    
    # ヘッダー行を書き込み
    csv_writer.writeheader()
    
    # データを書き込み
    csv_writer.writerows(employees)

print("従業員データをCSVファイルに保存しました")

このコードを実行してみましょう。

python csv_dict_write.py

実行結果は以下のようになります。

従業員データをCSVファイルに保存しました

作成されたemployees.csvファイルの中身は以下のようになります。

名前,部署,給与
田中太郎,開発,400000
佐藤花子,デザイン,380000
山田次郎,営業,350000

csv.DictWriter()を使うと、辞書形式のデータを簡単にCSVファイルに書き込むことができます。 fieldnamesでヘッダーの順序を指定し、writeheader()でヘッダー行を書き込みます。

CSVファイルに新しいデータを追加する

既存のCSVファイルに新しいデータを追加することもできます。

同じファイルに以下のコードを追加してみましょう。

import csv

# 辞書形式のデータを準備
employees = [
    {'名前': '田中太郎', '部署': '開発', '給与': 400000},
    {'名前': '佐藤花子', '部署': 'デザイン', '給与': 380000},
    {'名前': '山田次郎', '部署': '営業', '給与': 350000}
]

# 辞書形式でCSVファイルに書き込み
with open('employees.csv', 'w', newline='', encoding='utf-8') as file:
    # ヘッダーを指定
    fieldnames = ['名前', '部署', '給与']
    csv_writer = csv.DictWriter(file, fieldnames=fieldnames)
    
    # ヘッダー行を書き込み
    csv_writer.writeheader()
    
    # データを書き込み
    csv_writer.writerows(employees)

print("従業員データをCSVファイルに保存しました")

# 新しい従業員データを追加
new_employee = {'名前': '鈴木美咲', '部署': '人事', '給与': 360000}

with open('employees.csv', 'a', newline='', encoding='utf-8') as file:
    fieldnames = ['名前', '部署', '給与']
    csv_writer = csv.DictWriter(file, fieldnames=fieldnames)
    
    # 新しいデータを1行追加
    csv_writer.writerow(new_employee)

print("新しい従業員データを追加しました")

実行すると、既存のファイルに新しい行が追加されます。

python csv_dict_write.py
従業員データをCSVファイルに保存しました
新しい従業員データを追加しました

追加後のemployees.csvファイルの中身は以下のようになります。

名前,部署,給与
田中太郎,開発,400000
佐藤花子,デザイン,380000
山田次郎,営業,350000
鈴木美咲,人事,360000

'a'モード(追記モード)を使うことで、既存のデータを保持したまま新しいデータを追加できます。

まとめ

本章では、PythonでCSVファイルを扱う基本的な方法について学習しました。 習得した内容は以下の通りです。

  • CSVファイルが表形式のデータを保存するためのファイル形式であることを理解しました
  • csv.reader()を使ってCSVファイルからデータを読み込む方法を学習しました
  • csv.writer()を使ってCSVファイルにデータを書き込む方法を習得しました
  • csv.DictReader()csv.DictWriter()を使った辞書形式での操作方法を理解しました
  • 既存のCSVファイルに新しいデータを追加する方法を学習しました

CSVファイルは、データの保存や交換によく使われる重要なファイル形式です。 大量のデータを整理したり、他のシステムとデータをやり取りしたりする際に、これらのスキルが役立ちます。

このセクションは有料サブスクリプションへの登録、またはログインが必要です。完全なコンテンツにアクセスするには、料金ページ(/pricing)をご覧ください。購入済みの場合は、ログインしてください。

Starterプランでより詳しく学習

この先のコンテンツを読むにはStarterプラン以上が必要です。より詳細な解説、実践的なサンプルコード、演習問題にアクセスして学習を深めましょう。

作成者:とまだ
Previous
テキストファイルに書き込んでみよう