DictReader を使用した便利な CSV 処理
前のステップでは、基本的な csv.reader および csv.writer 関数を扱いました。次に、csv.DictReader クラスを使用して CSV ファイルを処理する、より便利な方法を探ってみましょう。これは、列ヘッダーを持つデータを扱う場合に特に役立ちます。
DictReader とは?
csv.DictReader は CSV ファイルを読み込み、各行を辞書として返します。ここで、
- キーは、列ヘッダー(デフォルトでは CSV ファイルの最初の行)から取得されます
- 値は、各行の対応するデータです
このアプローチにより、コードの可読性が向上し、エラーが発生しにくくなります。これは、インデックスではなく名前で列を参照できるためです。
より大きなテストファイルの作成
まず、DictReader の利点を示すために、少し大きな CSV ファイルを作成しましょう。create_users_data.py という名前の新しいファイルを作成し、次のコードを記述します。
import csv
import random
## サンプルユーザーデータを生成する
def generate_users(count):
users = [['id', 'name', 'email', 'age', 'country']] ## ヘッダー行
domains = ['gmail.com', 'yahoo.com', 'outlook.com', 'example.com']
countries = ['USA', 'Canada', 'UK', 'Australia', 'Germany', 'France', 'Japan', 'Brazil']
first_names = ['John', 'Jane', 'Michael', 'Emily', 'David', 'Sarah', 'Robert', 'Lisa']
last_names = ['Smith', 'Johnson', 'Brown', 'Davis', 'Wilson', 'Miller', 'Jones', 'Taylor']
for i in range(1, count + 1):
first_name = random.choice(first_names)
last_name = random.choice(last_names)
name = f"{first_name} {last_name}"
email = f"{first_name.lower()}.{last_name.lower()}@{random.choice(domains)}"
age = random.randint(18, 65)
country = random.choice(countries)
users.append([str(i), name, email, str(age), country])
return users
## 100 人のユーザーを持つ CSV ファイルを作成する
users_data = generate_users(100)
## CSV ファイルにデータを書き込む
with open('users_data.csv', 'w', newline='') as file:
writer = csv.writer(file)
writer.writerows(users_data)
print(f"100 件のユーザーレコードを含む 'users_data.csv' を作成しました")
スクリプトを実行してファイルを作成します。
python3 create_users_data.py
期待される出力:
100 件のユーザーレコードを含む 'users_data.csv' を作成しました
この新しいファイルの最初の数行を調べてみましょう。
head -n 5 users_data.csv
ヘッダー行とそれに続く 4 行のデータが表示されるはずです。
id,name,email,age,country
1,John Smith,john.smith@gmail.com,25,USA
2,Emily Brown,emily.brown@yahoo.com,32,Canada
3,David Jones,david.jones@outlook.com,45,UK
4,Sarah Wilson,sarah.wilson@example.com,28,Australia
DictReader を使用した CSV ファイルの処理
次に、DictReader を使用してこのファイルを処理するスクリプトを作成しましょう。dict_reader_example.py という名前の新しいファイルを作成し、次のコードを記述します。
import csv
## DictReader を使用して CSV ファイルを読み込む
with open('users_data.csv', 'r') as file:
csv_reader = csv.DictReader(file)
## フィールド名(列ヘッダー)を出力する
print(f"列ヘッダー: {csv_reader.fieldnames}")
print("\n最初の 5 件のレコード:")
print("-----------------")
## 最初の 5 件のレコードを出力する
for i, row in enumerate(csv_reader):
if i < 5:
## 名前でフィールドにアクセスする
print(f"ユーザー {row['id']}: {row['name']}, {row['age']} 歳,{row['country']} 出身")
print(f" メール:{row['email']}")
else:
break
## DictReader を使用したデータ分析
with open('users_data.csv', 'r') as file:
csv_reader = csv.DictReader(file)
## 平均年齢を計算する
total_age = 0
user_count = 0
## 国別のユーザー数をカウントする
countries = {}
for row in csv_reader:
user_count += 1
total_age += int(row['age'])
## 国別のユーザー数をカウントする
country = row['country']
if country in countries:
countries[country] += 1
else:
countries[country] = 1
avg_age = total_age / user_count if user_count > 0 else 0
print("\nデータ分析:")
print("--------------")
print(f"総ユーザー数:{user_count}")
print(f"平均年齢:{avg_age:.2f} 歳")
print("\n国別のユーザー:")
for country, count in sorted(countries.items(), key=lambda x: x[1], reverse=True):
print(f" {country}: {count} ユーザー")
このスクリプトを実行します。
python3 dict_reader_example.py
期待される出力(データはランダムに生成されるため、正確な値は異なる場合があります):
列ヘッダー: ['id', 'name', 'email', 'age', 'country']
最初の 5 件のレコード:
-----------------
ユーザー 1: John Smith, 25 歳, USA 出身
メール: john.smith@gmail.com
ユーザー 2: Emily Brown, 32 歳, Canada 出身
メール: emily.brown@yahoo.com
ユーザー 3: David Jones, 45 歳, UK 出身
メール: david.jones@outlook.com
ユーザー 4: Sarah Wilson, 28 歳, Australia 出身
メール: sarah.wilson@example.com
ユーザー 5: Michael Taylor, 37 歳, Germany 出身
メール: michael.taylor@example.com
データ分析:
--------------
総ユーザー数: 100
平均年齢: 41.35 歳
国別のユーザー:
USA: 16 ユーザー
Canada: 14 ユーザー
Japan: 13 ユーザー
UK: 12 ユーザー
Germany: 12 ユーザー
Australia: 12 ユーザー
France: 11 ユーザー
Brazil: 10 ユーザー
DictReader を使用する利点
ご覧のとおり、DictReader を使用すると、いくつかの利点があります。
- 可読性の高いコード: インデックス位置を覚える代わりに、名前でフィールドにアクセスできます
- 自己文書化: コードは、アクセスしているフィールドを明確に示しています
- 柔軟性: CSV ファイルの列の順序が変更されても、列名が同じままであれば、コードは引き続き機能します
このアプローチは、多くの列を持つ実際のデータや、列の順序が時間の経過とともに変更される可能性があるデータを扱う場合に特に役立ちます。
次のステップでは、すべてを一度にメモリにロードすることなく、より大きな CSV ファイルを処理するための効率的なテクニックを探ります。