[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.reader
やDictReader
では、読み込み時に区切り文字やクォート文字を指定することができます。
デフォルトではカンマ,
が区切り文字ですが、他の文字を使用する場合は、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.writer
やDictWriter
では、書き込み時に区切り文字やクォート文字を指定することができます。
デフォルトではカンマ,
が区切り文字ですが、他の文字を使用する場合は、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
が発生します。
このエラーを適切に処理するためには、try
とexcept
を使用します。
以下はその例です。
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ファイルへの書き込み時にもエラーが発生する可能性があります。
例えば、書き込み先のディレクトリが存在しない場合や、ファイルが他のプロセスによってロックされている場合です。
これらのエラーを処理するためには、try
とexcept
を使用します。
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ファイルを積極的に活用し、データ処理のスキルを向上させてみてはいかがでしょうか。