ファイル

[Python] CSVファイルの使い方 – スクリプトから読み書きする

Pythonでは、csvモジュールを使用してCSVファイルの読み書きが簡単に行えます。

ファイルを読み込む際は、csv.readerを使い、各行をリストとして取得します。

書き込みには、csv.writerを使い、リストやタプルを行として書き込みます。

ファイルを開く際は、open関数を使い、読み込み時には'r'モード、書き込み時には'w'モードを指定します。

with文を使うと、ファイルの自動クローズが保証されます。

CSVファイルとは

CSV(Comma-Separated Values)ファイルは、データをテキスト形式で保存するためのシンプルなフォーマットです。

各行がレコードを表し、カンマで区切られた値がそのレコードのフィールドを示します。

CSVファイルは、スプレッドシートソフトウェアやデータベースといった多くのアプリケーションで広く使用されており、データのインポートやエクスポートに便利です。

CSVファイルの主な特徴は以下の通りです:

  • シンプルな構造:テキストファイルであるため、どのプログラムでも簡単に読み書きできます。
  • 可読性:人間が直接内容を確認できるため、デバッグやデータの確認が容易です。
  • プラットフォーム非依存:異なるシステム間でデータをやり取りする際に、特別なソフトウェアが不要です。

このような特性から、CSVファイルはデータ分析やデータ処理の場面で非常に重宝されています。

Pythonを使ってCSVファイルを扱うことで、データの読み込みや書き込み、加工が簡単に行えるようになります。

PythonでCSVファイルを扱うための準備

csvモジュールのインポート

PythonでCSVファイルを扱うためには、標準ライブラリに含まれているcsvモジュールをインポートする必要があります。

このモジュールは、CSVファイルの読み書きを簡単に行うための機能を提供しています。

以下のようにインポートします。

import csv

CSVファイルのパス指定方法

CSVファイルを読み書きする際には、ファイルのパスを正しく指定することが重要です。

パスは絶対パスまたは相対パスで指定できます。

以下は、相対パスを使用してCSVファイルを指定する例です。

file_path = 'data/sample.csv'  # 相対パス

絶対パスを使用する場合は、ファイルのフルパスを指定します。

file_path = '/Users/username/Documents/data/sample.csv'  # 絶対パス

ファイルのエンコーディングに注意

CSVファイルを扱う際には、ファイルのエンコーディングにも注意が必要です。

特に日本語を含むデータを扱う場合、UTF-8やShift_JISなどのエンコーディングを指定することが重要です。

以下のように、open関数でエンコーディングを指定してファイルを開くことができます。

with open('data/sample.csv', mode='r', encoding='utf-8') as file:
    reader = csv.reader(file)

エンコーディングを正しく指定することで、文字化けを防ぎ、データを正確に読み込むことができます。

CSVファイルの読み込み

csv.readerを使った基本的な読み込み

csv.readerを使用すると、CSVファイルを簡単に読み込むことができます。

以下のコードは、CSVファイルを読み込み、各行をリストとして表示する例です。

import csv
with open('data/sample.csv', mode='r', encoding='utf-8') as file:
    reader = csv.reader(file)
    for row in reader:
        print(row)

このコードを実行すると、CSVファイルの各行がリスト形式で出力されます。

['名前', '年齢', '職業']
['田中', '30', 'エンジニア']
['佐藤', '25', 'デザイナー']

DictReaderを使った辞書形式での読み込み

DictReaderを使用すると、CSVファイルの各行を辞書形式で読み込むことができます。

これにより、列名をキーとしてデータにアクセスできるため、可読性が向上します。

以下はその例です。

import csv
with open('data/sample.csv', mode='r', encoding='utf-8') as file:
    reader = csv.DictReader(file)
    for row in reader:
        print(row)

このコードを実行すると、各行が辞書形式で出力されます。

{'名前': '田中', '年齢': '30', '職業': 'エンジニア'}
{'名前': '佐藤', '年齢': '25', '職業': 'デザイナー'}

読み込み時のオプション設定(区切り文字、クォート文字など)

csv.readerDictReaderでは、読み込み時に区切り文字やクォート文字を指定することができます。

デフォルトではカンマ,が区切り文字ですが、他の文字を使用する場合は、delimiterオプションを指定します。

以下は、タブ区切りのCSVファイルを読み込む例です。

import csv
with open('data/sample.tsv', mode='r', encoding='utf-8') as file:
    reader = csv.reader(file, delimiter='\t')
    for row in reader:
        print(row)

また、クォート文字を指定する場合は、quotecharオプションを使用します。

import csv
with open('data/sample.csv', mode='r', encoding='utf-8') as file:
    reader = csv.reader(file, quotechar='"')
    for row in reader:
        print(row)

大規模なCSVファイルの効率的な読み込み方法

大規模なCSVファイルを効率的に読み込むためには、pandasライブラリを使用することが推奨されます。

pandasは、データフレーム形式でデータを扱うことができ、メモリ効率が良く、高速な処理が可能です。

以下は、pandasを使用してCSVファイルを読み込む例です。

import pandas as pd
df = pd.read_csv('data/large_sample.csv')
print(df.head())  # 最初の5行を表示

この方法を使用することで、大規模なデータセットでもスムーズに処理することができます。

CSVファイルへの書き込み

csv.writerを使った基本的な書き込み

csv.writerを使用すると、CSVファイルにデータを書き込むことができます。

以下のコードは、リスト形式のデータをCSVファイルに書き込む例です。

import csv
data = [
    ['名前', '年齢', '職業'],
    ['田中', '30', 'エンジニア'],
    ['佐藤', '25', 'デザイナー']
]
with open('data/output.csv', mode='w', encoding='utf-8', newline='') as file:
    writer = csv.writer(file)
    writer.writerows(data)  # 複数行のデータを書き込む

このコードを実行すると、output.csvというファイルが作成され、指定したデータが書き込まれます。

DictWriterを使った辞書形式での書き込み

DictWriterを使用すると、辞書形式のデータをCSVファイルに書き込むことができます。

これにより、列名をキーとしてデータを管理できるため、可読性が向上します。

以下はその例です。

import csv
data = [
    {'名前': '田中', '年齢': '30', '職業': 'エンジニア'},
    {'名前': '佐藤', '年齢': '25', '職業': 'デザイナー'}
]
with open('data/output_dict.csv', mode='w', encoding='utf-8', newline='') as file:
    fieldnames = ['名前', '年齢', '職業']
    writer = csv.DictWriter(file, fieldnames=fieldnames)
    writer.writeheader()  # ヘッダーを書き込む
    writer.writerows(data)  # 複数行のデータを書き込む

このコードを実行すると、output_dict.csvというファイルが作成され、辞書形式のデータが書き込まれます。

書き込み時のオプション設定(区切り文字、クォート文字など)

csv.writerDictWriterでは、書き込み時に区切り文字やクォート文字を指定することができます。

デフォルトではカンマ,が区切り文字ですが、他の文字を使用する場合は、delimiterオプションを指定します。

以下は、タブ区切りのCSVファイルを書き込む例です。

import csv
data = [
    ['名前', '年齢', '職業'],
    ['田中', '30', 'エンジニア'],
    ['佐藤', '25', 'デザイナー']
]
with open('data/output.tsv', mode='w', encoding='utf-8', newline='') as file:
    writer = csv.writer(file, delimiter='\t')  # タブ区切り
    writer.writerows(data)

また、クォート文字を指定する場合は、quotecharオプションを使用します。

import csv
data = [
    ['名前', '年齢', '職業'],
    ['田中', '30', 'エンジニア'],
    ['佐藤', '25', 'デザイナー']
]
with open('data/output_quoted.csv', mode='w', encoding='utf-8', newline='') as file:
    writer = csv.writer(file, quotechar='"', quoting=csv.QUOTE_MINIMAL)
    writer.writerows(data)

追記モードでの書き込み方法

既存のCSVファイルにデータを追加する場合は、追記モード'a'を使用します。

以下は、既存のCSVファイルに新しいデータを追記する例です。

import csv
new_data = [
    ['鈴木', '28', 'マネージャー'],
    ['高橋', '35', 'ディレクター']
]
with open('data/output.csv', mode='a', encoding='utf-8', newline='') as file:
    writer = csv.writer(file)
    writer.writerows(new_data)  # 新しいデータを追記

このコードを実行すると、output.csvファイルの末尾に新しいデータが追加されます。

追記モードを使用することで、既存のデータを保持しつつ、新しい情報を簡単に追加できます。

CSVファイルの加工と操作

読み込んだデータのフィルタリング

読み込んだCSVデータをフィルタリングすることで、特定の条件に合ったデータのみを抽出できます。

以下の例では、年齢が30歳以上のデータをフィルタリングしています。

import csv
filtered_data = []
with open('data/sample.csv', mode='r', encoding='utf-8') as file:
    reader = csv.DictReader(file)
    for row in reader:
        if int(row['年齢']) >= 30:  # 年齢が30以上の行を抽出
            filtered_data.append(row)
print(filtered_data)

このコードを実行すると、年齢が30歳以上のデータのみが表示されます。

読み込んだデータのソート

読み込んだデータを特定の列でソートすることも可能です。

以下の例では、年齢でデータをソートしています。

import csv
data = []
with open('data/sample.csv', mode='r', encoding='utf-8') as file:
    reader = csv.DictReader(file)
    for row in reader:
        data.append(row)
# 年齢でソート
sorted_data = sorted(data, key=lambda x: int(x['年齢']))
print(sorted_data)

このコードを実行すると、年齢の昇順でソートされたデータが表示されます。

読み込んだデータの変換(数値変換、文字列操作など)

データを加工する際には、数値変換や文字列操作が必要になることがあります。

以下の例では、年齢を整数に変換し、職業名を大文字に変換しています。

import csv
modified_data = []
with open('data/sample.csv', mode='r', encoding='utf-8') as file:
    reader = csv.DictReader(file)
    for row in reader:
        row['年齢'] = int(row['年齢'])  # 年齢を整数に変換
        row['職業'] = row['職業'].upper()  # 職業名を大文字に変換
        modified_data.append(row)
print(modified_data)

このコードを実行すると、年齢が整数に変換され、職業名が大文字に変換されたデータが表示されます。

CSVファイルの列の追加・削除

CSVファイルの列を追加したり削除したりすることも可能です。

以下の例では、新しい列「住所」を追加し、既存の列「職業」を削除しています。

import csv
updated_data = []
with open('data/sample.csv', mode='r', encoding='utf-8') as file:
    reader = csv.DictReader(file)
    for row in reader:
        row['住所'] = '未記入'  # 新しい列「住所」を追加
        del row['職業']  # 列「職業」を削除
        updated_data.append(row)
# 更新されたデータを新しいCSVファイルに書き込む
with open('data/updated_sample.csv', mode='w', encoding='utf-8', newline='') as file:
    fieldnames = updated_data[0].keys()
    writer = csv.DictWriter(file, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerows(updated_data)

このコードを実行すると、元のデータに「住所」列が追加され、「職業」列が削除された新しいCSVファイルが作成されます。

これにより、データの構造を柔軟に変更することができます。

エラーハンドリング

ファイルが存在しない場合の対処法

CSVファイルを読み込む際に、指定したファイルが存在しない場合はFileNotFoundErrorが発生します。

このエラーを適切に処理するためには、tryexceptを使用します。

以下はその例です。

import csv
file_path = 'data/non_existent_file.csv'
try:
    with open(file_path, mode='r', encoding='utf-8') as file:
        reader = csv.reader(file)
        for row in reader:
            print(row)
except FileNotFoundError:
    print(f"エラー: ファイル '{file_path}' が見つかりません。")

このコードを実行すると、ファイルが存在しない場合にエラーメッセージが表示されます。

読み込み時のデータ不整合の対処法

CSVファイルを読み込む際に、データの形式が不整合である場合(例えば、数値が文字列として保存されているなど)、エラーが発生することがあります。

このような場合には、データの整合性を確認し、適切に処理する必要があります。

以下はその例です。

import csv
data = []
with open('data/sample.csv', mode='r', encoding='utf-8') as file:
    reader = csv.DictReader(file)
    for row in reader:
        try:
            row['年齢'] = int(row['年齢'])  # 年齢を整数に変換
            data.append(row)
        except ValueError:
            print(f"警告: 行 {row} の年齢が不正です。")

このコードを実行すると、年齢の変換に失敗した行について警告が表示されます。

書き込み時のエラー処理

CSVファイルへの書き込み時にもエラーが発生する可能性があります。

例えば、書き込み先のディレクトリが存在しない場合や、ファイルが他のプロセスによってロックされている場合です。

これらのエラーを処理するためには、tryexceptを使用します。

import csv
data = [['名前', '年齢'], ['田中', '30'], ['佐藤', '25']]
try:
    with open('data/output.csv', mode='w', encoding='utf-8', newline='') as file:
        writer = csv.writer(file)
        writer.writerows(data)
except IOError:
    print("エラー: ファイルへの書き込み中に問題が発生しました。")

このコードを実行すると、書き込み時にエラーが発生した場合にエラーメッセージが表示されます。

エンコーディングエラーの対処法

CSVファイルを読み書きする際に、エンコーディングの不一致が原因でエラーが発生することがあります。

特に日本語を含むデータを扱う場合、UTF-8やShift_JISなどのエンコーディングを正しく指定することが重要です。

以下は、エンコーディングエラーを処理する例です。

import csv
file_path = 'data/sample.csv'
try:
    with open(file_path, mode='r', encoding='utf-8') as file:
        reader = csv.reader(file)
        for row in reader:
            print(row)
except UnicodeDecodeError:
    print(f"エラー: ファイル '{file_path}' のエンコーディングが不正です。")

このコードを実行すると、エンコーディングエラーが発生した場合にエラーメッセージが表示されます。

エンコーディングを適切に指定することで、文字化けを防ぎ、データを正確に読み込むことができます。

応用例

CSVファイルをPandasで扱う

pandasライブラリを使用すると、CSVファイルの読み込みや書き込みが非常に簡単になります。

pandasはデータフレーム形式でデータを扱うため、データの操作が直感的に行えます。

以下は、CSVファイルをpandasで読み込む例です。

import pandas as pd
# CSVファイルを読み込む
df = pd.read_csv('data/sample.csv')
# データの表示
print(df.head())  # 最初の5行を表示

このコードを実行すると、CSVファイルの内容がデータフレームとして表示されます。

複数のCSVファイルを結合する

複数のCSVファイルを結合する場合も、pandasを使用すると簡単です。

以下の例では、2つのCSVファイルを縦に結合しています。

import pandas as pd
# 複数のCSVファイルを読み込む
df1 = pd.read_csv('data/sample1.csv')
df2 = pd.read_csv('data/sample2.csv')
# データフレームを縦に結合
combined_df = pd.concat([df1, df2], ignore_index=True)
# 結合したデータの表示
print(combined_df)

このコードを実行すると、2つのCSVファイルのデータが1つのデータフレームに結合されます。

CSVファイルをExcel形式に変換する

pandasを使用すると、CSVファイルをExcel形式に簡単に変換できます。

以下は、その例です。

import pandas as pd
# CSVファイルを読み込む
df = pd.read_csv('data/sample.csv')
# Excelファイルに書き込む
df.to_excel('data/output.xlsx', index=False)

このコードを実行すると、sample.csvの内容がoutput.xlsxというExcelファイルに保存されます。

Web APIから取得したデータをCSVに保存する

Web APIから取得したデータをCSVファイルに保存することも可能です。

以下の例では、requestsライブラリを使用してAPIからデータを取得し、CSVファイルに保存しています。

import requests
import csv
# Web APIからデータを取得
response = requests.get('https://api.example.com/data')
data = response.json()  # JSON形式でデータを取得
# CSVファイルに書き込む
with open('data/api_data.csv', mode='w', encoding='utf-8', newline='') as file:
    writer = csv.writer(file)
    writer.writerow(data[0].keys())  # ヘッダーを書き込む
    for item in data:
        writer.writerow(item.values())  # 各データを行として書き込む

このコードを実行すると、APIから取得したデータがapi_data.csvというCSVファイルに保存されます。

CSVファイルをデータベースにインポートする

CSVファイルのデータをデータベースにインポートすることも可能です。

以下の例では、sqlite3を使用してCSVファイルのデータをSQLiteデータベースにインポートしています。

import sqlite3
import pandas as pd
# SQLiteデータベースに接続
conn = sqlite3.connect('data/database.db')
# CSVファイルを読み込む
df = pd.read_csv('data/sample.csv')
# データフレームをデータベースにインポート
df.to_sql('sample_table', conn, if_exists='replace', index=False)
# 接続を閉じる
conn.close()

このコードを実行すると、sample.csvの内容がsample_tableというテーブルにインポートされます。

これにより、CSVデータをデータベースで効率的に管理することができます。

まとめ

この記事では、Pythonを使用してCSVファイルを読み書きする方法や、データの加工、エラーハンドリング、応用例について詳しく解説しました。

CSVファイルはデータの保存や交換に非常に便利なフォーマットであり、Pythonのcsvモジュールやpandasライブラリを活用することで、効率的にデータを扱うことが可能です。

これを機に、実際のプロジェクトやデータ分析においてCSVファイルを積極的に活用し、データ処理のスキルを向上させてみてはいかがでしょうか。

関連記事

Back to top button