Python

【Python】CSVファイル操作完全ガイド

CSV(Comma Separated Values)ファイルは、データをテキストベースで表現するための一般的な形式です。Pythonでは、csvモジュール、numpy、およびpandasなどを使用してCSVファイルを読み書きすることができます。それぞれの方法について詳細に解説します。

csvモジュールを使用した方法

csv モジュールは、CSV ファイルを読み込みパースする標準ライブラリです。csv モジュールを使うと CSV ファイルの読み込みや書き出し、追記ができます。

csv モジュールのポイント

  • csv.reader クラスは、CSV ファイルの読み込みを行います。
  • csv.writer クラスは、CSV ファイルの書き込みを行います。
  • for 文の前に next()を入れるとヘッダを読み飛ばすことができます。
  • リスト内包表記が使えます。
  • DictReader()クラスは、辞書のリストを作ります。

csvモジュールを使用したサンプル

import csv

# CSVファイルの読み込み
with open('data.csv', 'r') as file:
    reader = csv.reader(file)
    for row in reader:
        print(row)

# CSVファイルの書き込み
data = [
    ['Name', 'Age', 'Country'],
    ['Alice', 25, 'USA'],
    ['Bob', 30, 'Canada']
]

with open('output.csv', 'w', newline='') as file:
    writer = csv.writer(file)
    writer.writerows(data)

解説

import csv

# CSVファイルの読み込み
with open('data.csv', 'r') as file:
    reader = csv.reader(file)
    for row in reader:
        print(row)
  1. csvモジュールをインポートしています。これはCSV形式のデータを読み書きするための標準ライブラリです。
  2. open関数を使用してファイルを開き、'r'モードで読み込みます。
  3. csv.readerを使用して、ファイルオブジェクトからCSVリーダーを作成します。
  4. for row in readerでCSVファイルの各行を反復処理し、各行を表示しています。
# CSVファイルの書き込み
data = [
    ['Name', 'Age', 'Country'],
    ['Alice', 25, 'USA'],
    ['Bob', 30, 'Canada']
]

with open('output.csv', 'w', newline='') as file:
    writer = csv.writer(file)
    writer.writerows(data)
  1. dataという2次元リストに書き込むデータがあります。ここではヘッダーと2つのデータ行が含まれています。
  2. open関数を使用して新しいファイル 'output.csv''w' モードで作成します。newline=''は改行コードを指定しています。
  3. csv.writerを使用して、ファイルオブジェクトからCSVライターを作成します。
  4. writer.writerows(data)を使用して、データリスト全体を一度にCSVファイルに書き込みます。

csvモジュールの利点と適用シーン

利点:

  • 標準ライブラリなので追加のインストールが不要。
  • シンプルで直感的な使い方。

適用シーン:

  • 単純なCSV操作が必要な場合。

numpyを使用した方法

numpyは高性能な数値計算ライブラリであり、CSVデータの効率的な処理が可能です。

numpyを使用したサンプル

import numpy as np

# CSVファイルの読み込み
data = np.genfromtxt('data.csv', delimiter=',', dtype=None, names=True, encoding=None)
print(data)

# CSVファイルの書き込み
data = np.array([(1, 'Alice', 25), (2, 'Bob', 30)], dtype=[('ID', int), ('Name', 'U10'), ('Age', int)])

np.savetxt('output.csv', data, delimiter=',', fmt='%s', header='ID,Name,Age', comments='')

解説

import csv
import numpy as np

# CSVファイルの読み込み
data = np.genfromtxt('data.csv', delimiter=',', dtype=None, names=True, encoding=None)
print(data)
  1. import csv: CSVファイルの読み込みに必要なcsvモジュールをインポートします。
  2. import numpy as np: 数値計算やデータ操作に便利なnumpyをインポートします。npは慣例的に使用される別名です。
  3. data = np.genfromtxt('data.csv', delimiter=',', dtype=None, names=True, encoding=None): numpygenfromtxt関数を使ってCSVファイルを読み込みます。
    • 'data.csv': 読み込むCSVファイルの名前。
    • delimiter=',': データの区切り文字。ここではカンマ(‘,’)を指定しています。
    • dtype=None: データの型を自動で判定する設定。
    • names=True: ヘッダーがある場合に、列の名前を使用する。
    • encoding=None: 文字エンコーディングを自動で判定する。
  4. print(data): 読み込んだデータを表示します。
# CSVファイルの書き込み
data = np.array([(1, 'Alice', 25), (2, 'Bob', 30)], dtype=[('ID', int), ('Name', 'U10'), ('Age', int)])
np.savetxt('output.csv', data, delimiter=',', fmt='%s', header='ID,Name,Age', comments='')
  1. data = np.array([(1, 'Alice', 25), (2, 'Bob', 30)], dtype=[('ID', int), ('Name', 'U10'), ('Age', int)]): 新しいデータをnumpyの配列として作成します。
    • dtype=[('ID', int), ('Name', 'U10'), ('Age', int)]: 各列の名前とデータ型を指定しています。
  2. np.savetxt('output.csv', data, delimiter=',', fmt='%s', header='ID,Name,Age', comments=''): numpysavetxt関数を使ってCSVファイルにデータを書き込みます。
    • 'output.csv': 書き込むCSVファイルの名前。
    • data: 書き込むデータ。
    • delimiter=',': データの区切り文字。
    • fmt='%s': データの書き込みフォーマット。ここでは文字列として書き込む設定。
    • header='ID,Name,Age': ヘッダーを指定しています。
    • comments='': コメント行がないことを指定しています。

numpyの利点と適用シーン

利点:

  • 数値データの処理に優れている。
  • 行と列の名前を指定してデータにアクセスできる。

適用シーン:

  • 大規模な数値データ処理が必要な場合。

pandasを使用した方法

pandasはデータ分析や操作に特化したライブラリで、CSVデータの高度な処理が可能です。

pandasを使用したサンプル

import pandas as pd

# CSVファイルの読み込み
df = pd.read_csv('data.csv')
print(df)

# CSVファイルの書き込み
data = {'Name': ['Alice', 'Bob'], 'Age': [25, 30], 'Country': ['USA', 'Canada']}
df = pd.DataFrame(data)

df.to_csv('output.csv', index=False)

解説

import pandas as pd

# CSVファイルの読み込み
df = pd.read_csv('data.csv')
print(df)
  1. import pandas as pd: pandasライブラリをpdとしてインポートします。pdは慣例的に使用される別名です。
  2. pd.read_csv('data.csv'): pandasread_csv関数を使用して、’data.csv’というファイルからデータを読み込みます。読み込んだデータはデータフレーム (DataFrame) と呼ばれるpandasのデータ構造に格納されます。これはテーブルのような2次元のデータ構造です。
  3. print(df): 読み込んだデータフレームをコンソールに出力します。
# CSVファイルの書き込み
data = {'Name': ['Alice', 'Bob'], 'Age': [25, 30], 'Country': ['USA', 'Canada']}
df = pd.DataFrame(data)

df.to_csv('output.csv', index=False)
  1. data = {'Name': ['Alice', 'Bob'], 'Age': [25, 30], 'Country': ['USA', 'Canada']}: 新しいデータを作成します。ここでは3つの列 (‘Name’, ‘Age’, ‘Country’) を持つデータを辞書形式で作成しています。
  2. df = pd.DataFrame(data): 辞書からデータフレームを作成します。これにより、新しいデータがデータフレームとして格納されます。
  3. df.to_csv('output.csv', index=False): to_csvメソッドを使用してデータフレームをCSVファイル (‘output.csv’) に書き込みます。index=Falseは、データフレームの行番号を出力に含めないように指定しています。

pandasの利点と適用シーン

利点:

  • データの柔軟な操作が可能。
  • 様々なデータ型や欠損値の扱いが容易。

適用シーン:

  • データの探索、クレンジング、分析が必要な場合。

それぞれの応用サンプル

今回紹介した3つの方法を利用した応用サンプルを紹介します。

csvモジュールの応用サンプル

import csv

# 応用: 特定の条件を満たす行のみを抽出する
with open('data.csv', 'r') as file:
    reader = csv.reader(file)
    header = next(reader)  # ヘッダーを読み飛ばす
    for row in reader:
        if int(row) > 25:  # 年齢が25歳より大きい行を抽出
            print(row)

# 応用: 新しいデータを追加する
new_data = ['3', 'Charlie', '28']
with open('data.csv', 'a', newline='') as file:
    writer = csv.writer(file)
    writer.writerow(new_data)
  • csv.readerはCSVファイルから行を読み込むためのオブジェクトです。next(reader)でヘッダーを読み飛ばしています。
  • 年齢が25歳より大きい行だけを抽出しています。これはCSVファイルの特定の条件に基づいたデータ処理の例です。
  • csv.writerを使用して新しいデータをCSVファイルに追加しています。

numpyの応用サンプル

import numpy as np

# 応用: 平均年齢を計算する
data = np.genfromtxt('data.csv', delimiter=',', dtype=None, names=True, encoding=None)
average_age = np.mean(data['Age'])
print(f'平均年齢: {average_age}')

# 応用: 年齢が30歳以上の行のみを抽出する
selected_rows = data[data['Age'] >= 30]
print(selected_rows)

# 応用: 新しいデータを追加する
new_data = np.array([(4, 'David', 35)], dtype=[('ID', int), ('Name', 'U10'), ('Age', int)])
np.savetxt('data.csv', np.append(data, new_data), delimiter=',', fmt='%s', header='ID,Name,Age', comments='')
  • numpyを使ってCSVファイルを読み込み、配列としてデータを扱います。genfromtxtはデータ型とヘッダーを指定できます。
  • 平均年齢を計算するためにnp.meanを使用しています。
  • 年齢が30歳以上の行を抽出するためにブールインデックスを使用しています。
  • 新しいデータを作成し、np.savetxtを使用してCSVファイルに追加しています。

pandasの応用サンプル

import pandas as pd

# 応用: 平均年齢を計算する
df = pd.read_csv('data.csv')
average_age = df['Age'].mean()
print(f'平均年齢: {average_age}')

# 応用: 特定の条件を満たす行のみを抽出する
selected_rows = df[df['Age'] >= 30]
print(selected_rows)

# 応用: 新しいデータを追加する
new_data = pd.DataFrame({'ID': , 'Name': ['David'], 'Age': [35]})
df = df.append(new_data, ignore_index=True)
df.to_csv('data.csv', index=False)
  • pandasはデータフレームとしてデータを扱い、高度なデータ分析機能を提供します。
  • pd.read_csvを使用してCSVファイルをデータフレームに読み込んでいます。
  • 平均年齢を計算するためにmean()メソッドを使用しています。
  • 年齢が30歳以上の行を抽出するために条件式を使用しています。
  • 新しいデータをデータフレームに追加し、to_csvメソッドを使用してCSVファイルに保存しています。

まとめ

  • csvモジュールは基本的なCSV操作に最適。
  • numpyは大規模な数値データに適している。
  • pandasは高度なデータ操作が可能で、データ分析に適している。

どの方法を選択するかは、プロジェクトの要件やデータの性質に依存します。基本的なCSV処理にはcsvモジュールが適しており、データ分析が中心であればpandasを選択すると良いでしょう。