【Python実践】CSVファイルからリストへ変換する方法を徹底解説!データ処理を効率化しよう

こんにちは!今回は多くの方から質問をいただく「CSVファイルからPythonのリストに変換する方法」について詳しく解説します。この技術をマスターすれば、Excel等で管理されたデータを簡単にPythonで扱えるようになりますよ!

※サンプルファイル

1. CSVファイルとは?

CSVとは「Comma-Separated Values(カンマ区切り値)」の略で、データをカンマ(,)で区切って保存するシンプルなファイル形式です。Excel等で作成・編集でき、多くのシステム間でデータをやり取りする際に使われます。

例えば、こんな内容のCSVファイルを想像してみてください:

名前,年齢,部署
田中太郎,28,営業部
鈴木花子,35,総務部
佐藤健,42,開発部

2. 標準ライブラリを使ったCSV読み込み

Pythonには標準ライブラリとしてcsvモジュールが用意されており、これを使えば簡単にCSVファイルを読み込んでリストに変換できます。

Python
import csv

# CSVファイルを読み込んでリストに変換する基本的な方法
with open('社員データ.csv', 'r', encoding='utf-8') as file:
    reader = csv.reader(file)
    data_list = list(reader)  # すべての行をリストに変換

print(data_list)
# 出力例: [['名前', '年齢', '部署'], ['田中太郎', '28', '営業部'], ...]

この方法では、CSVの各行が1つのリストとなり、全体として「リストのリスト」という2次元構造になります。

実務での活用場面: 社員名簿や顧客リストなど、シンプルな表形式のデータを読み込む際に便利です。

3. ヘッダー行を処理する方法

多くのCSVファイルは1行目にヘッダー(列名)を持っています。これを適切に処理する方法を見てみましょう:

Python
import csv

# ヘッダー行とデータ行を分けて読み込む
with open('社員データ.csv', 'r', encoding='utf-8') as file:
    reader = csv.reader(file)
    headers = next(reader)  # 最初の行をヘッダーとして読み込む
    data_list = list(reader)  # 残りの行をデータとして読み込む

print(f"ヘッダー: {headers}")
print(f"データ: {data_list}")

4. 辞書形式で読み込む方法

CSVデータを辞書のリストとして読み込むと、列名をキーとして各行のデータにアクセスできるようになり、より直感的に扱えます:

Python
import csv

# CSVをリストの辞書として読み込む
with open('社員データ.csv', 'r', encoding='utf-8') as file:
    reader = csv.DictReader(file)
    dict_list = list(reader)

print(dict_list)
# 出力例: [{'名前': '田中太郎', '年齢': '28', '部署': '営業部'}, ...]

# 特定のデータにアクセスする例
for person in dict_list:
    print(f"{person['名前']}さんは{person['部署']}所属です")

実務での活用場面: 列名が明確で、特定の列のデータにアクセスする必要がある場合に便利です。顧客情報の分析や社員データの処理などに最適です。

5. リスト内包表記を使ったCSVデータの加工

リスト内包表記を使えば、CSV読み込み後のデータ加工を効率化できます:

Python
import csv

# CSVを読み込んで特定の加工を施す
with open('売上データ.csv', 'r', encoding='utf-8') as file:
    reader = csv.reader(file)
    headers = next(reader)  # ヘッダーをスキップ
    
    # 数値(文字列)を整数に変換する例
    sales_data = [[row[0], int(row[1])] for row in reader]

print(sales_data)
# 出力例: [['商品A', 1200], ['商品B', 3400], ...]

さらに、条件付きリスト内包表記を使って特定の条件を満たす行だけを抽出することもできます:

Python
# 売上が1000以上の商品だけを抽出
high_sales = [[row[0], int(row[1])] for row in reader if int(row[1]) >= 1000]

6. pandasを使ったCSV読み込み(より高度な方法)

より複雑なCSV処理には、pandasライブラリがおすすめです。データ分析では実質的な標準ライブラリといえるほど強力なツールです:

Python
import pandas as pd

# pandasでCSVを読み込む
df = pd.read_csv('社員データ.csv')

# DataFrameをリストに変換する方法
data_list = df.values.tolist()  # すべての行をリストに変換
print(data_list)

# 特定の列だけをリストに変換
names_list = df['名前'].tolist()
print(names_list)  # ['田中太郎', '鈴木花子', '佐藤健']

# リスト内包表記との組み合わせ
dept_counts = [(dept, len(df[df['部署'] == dept])) for dept in df['部署'].unique()]
print(dept_counts)  # [('営業部', 1), ('総務部', 1), ('開発部', 1)]

実務での活用場面: 大量のデータ処理や、集計・分析が必要な場合に最適です。売上分析、顧客セグメンテーション、在庫管理など幅広い業務で活用できます。

7. CSVファイルの様々なケースに対応する

実際の業務ではさまざまな形式のCSVファイルに遭遇します。代表的な課題と対処法を見てみましょう:

7.1 区切り文字がカンマではない場合(TSVなど)

Python
# タブ区切りファイルを読み込む
with open('データ.tsv', 'r', encoding='utf-8') as file:
    reader = csv.reader(file, delimiter='\t')  # タブを区切り文字に指定
    data_list = list(reader)

7.2 エンコーディングの問題

日本語を含むCSVファイルでは、エンコーディングに注意が必要です:

Python
# 様々なエンコーディングに対応
try:
    with open('データ.csv', 'r', encoding='utf-8') as file:
        reader = csv.reader(file)
        data_list = list(reader)
except UnicodeDecodeError:
    # UTF-8で失敗したらShift-JISを試す
    with open('データ.csv', 'r', encoding='shift_jis') as file:
        reader = csv.reader(file)
        data_list = list(reader)

7.3 数値や日付の変換

CSVから読み込んだデータは基本的にすべて文字列です。数値や日付として扱うには変換が必要です:

Python
import csv
from datetime import datetime

with open('売上履歴.csv', 'r', encoding='utf-8') as file:
    reader = csv.reader(file)
    headers = next(reader)
    
    # 日付と売上を適切な型に変換
    processed_data = [
        [datetime.strptime(row[0], '%Y-%m-%d'), int(row[1])]
        for row in reader
    ]

print(processed_data)
# 出力例: [[datetime.datetime(2023, 2, 1, 0, 0), 1200], ...]

8. 実務で使える具体的な活用例

例1: 月次売上レポートの集計

Python
import csv
from collections import defaultdict

# 月次売上データを部門別に集計
monthly_sales = defaultdict(int)

with open('monthly_sales.csv', 'r', encoding='utf-8') as file:
    reader = csv.DictReader(file)
    for row in reader:
        department = row['部門']
        sales = int(row['売上'])
        monthly_sales[department] += sales

# 辞書をリストに変換して表示
sales_list = [[dept, amount] for dept, amount in monthly_sales.items()]
print(sales_list)
# 出力例: [['営業部', 12500000], ['マーケティング部', 8300000], ...]

実務での活用場面: 月末の部門別売上集計や予算管理に活用できます。

例2: 在庫データの分析

Python
import csv

# 在庫切れ商品のリストを作成
with open('inventory.csv', 'r', encoding='utf-8') as file:
    reader = csv.DictReader(file)
    
    # 在庫切れ(在庫数0)の商品をリストアップ
    out_of_stock = [
        [row['商品コード'], row['商品名'], row['カテゴリ']]
        for row in reader 
        if int(row['在庫数']) == 0
    ]

print(out_of_stock)
# 出力例: [['A12345', 'プリンタートナー黒', 'オフィス用品'], ...]

実務での活用場面: 日次の在庫確認と発注業務の自動化に活用できます。

9. エラー処理とデータクリーニング

実際のCSVデータは完璧ではなく、欠損値や不正な値が含まれていることがあります。こうしたケースに対応する方法も押さえておきましょう:

Python
import csv

cleaned_data = []

with open('messy_data.csv', 'r', encoding='utf-8') as file:
    reader = csv.reader(file)
    headers = next(reader)
    
    for row in reader:
        try:
            # データのクリーニングと変換
            if len(row) < 3:  # 不完全な行をスキップ
                continue
                
            # 空の値をデフォルト値で置き換え
            name = row[0] if row[0] else "名前なし"
            
            # 数値変換時のエラー処理
            try:
                age = int(row[1])
            except ValueError:
                age = 0  # 変換できない場合のデフォルト値
                
            cleaned_data.append([name, age, row[2]])
            
        except Exception as e:
            print(f"処理エラー: {e}, 行: {row}")
            continue

print(cleaned_data)

10. まとめ:CSVからリストへの変換テクニック

CSVファイルからPythonのリストへの変換は、以下のステップで行えます:

  1. 基本的な読み込み: csv.readerを使って全データをリストに変換
  2. 構造化されたデータ: csv.DictReaderで辞書のリストとして読み込む
  3. 高度な処理: pandasを使ってより柔軟に処理する
  4. データ加工: リスト内包表記を使って効率的にデータを加工

どの方法を選ぶかは、データの複雑さや処理内容によって異なります。シンプルな処理なら標準ライブラリのcsvモジュールで十分ですが、複雑な分析や大量データの処理にはpandasが最適です。

今回学んだテクニックを使えば、Excel等で管理されているビジネスデータをPythonに取り込み、自動化や分析に活用できるようになります。業務効率化の第一歩として、ぜひCSVデータの読み込み・処理にチャレンジしてみてください!

Leave a Comment

Your email address will not be published. Required fields are marked *