PythonでCSVファイルをマスター:読み込み・書き込みの基本から応用まで
CSV(Comma Separated Values)ファイルは、表形式のデータを扱う際に最も一般的でシンプルなファイル形式の一つです。Pythonは、このCSVファイルの**読み込み(入力)と書き込み(出力)**を簡単に行うための強力な機能を提供しています。データ分析、ログ処理、設定ファイルの管理など、多岐にわたる場面でCSVファイルの操作は必須スキルとなります。
この記事では、Pythonの標準ライブラリであるcsv
モジュールを使ったCSVファイルの基本的な読み込み・書き込み方法を、短いサンプルコードとともに解説します。さらに、データサイエンス分野で広く使われるpandas
ライブラリを使った、より高度な操作方法もご紹介します。
CSVファイルとは?なぜPythonで扱うのか?
CSVファイルは、データをカンマ(,
)で区切って格納するテキストファイルです。各行が1つのレコードを表し、各レコード内の値がカンマで区切られて列を形成します。
CSVの例
名前,年齢,都市
Alice,30,東京
Bob,25,大阪
Charlie,35,名古屋
PythonでCSVを扱うメリット
シンプルさ: テキストベースなので、特別なソフトウェアなしで内容を確認できます。
汎用性: 多くのプログラムやシステムでサポートされており、異なるアプリケーション間のデータ交換に便利です。
Pythonの強力なライブラリ:
csv
モジュールやpandas
が、複雑なCSVデータも効率的に扱える機能を提供します。
Python csv
モジュールで読み書きする
Pythonの標準ライブラリであるcsv
モジュールは、CSVファイルの読み込みと書き込みをシンプルに行うための機能を提供します。
CSVファイルを読み込む(入力)
CSVファイルを読み込むには、csv.reader
またはcsv.DictReader
を使用します。
1. csv.reader
でリストとして読み込む
各行を文字列のリストとして読み込みます。最も基本的な読み込み方法です。
import csv
# 読み込むCSVファイル名
file_name = "sample_data.csv"
# テスト用のCSVファイルを作成(一時的に)
with open(file_name, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(["名前", "年齢", "都市"])
writer.writerow(["Alice", 30, "東京"])
writer.writerow(["Bob", 25, "大阪"])
# CSVファイルを読み込み
data = []
with open(file_name, 'r', newline='', encoding='utf-8') as f:
reader = csv.reader(f)
header = next(reader) # ヘッダー行を読み飛ばす(または変数に格納)
for row in reader:
data.append(row)
print("ヘッダー:", header)
print("読み込んだデータ:", data)
# 出力例:
# ヘッダー: ['名前', '年齢', '都市']
# 読み込んだデータ: [['Alice', '30', '東京'], ['Bob', '25', '大阪']]
newline=''
:CSVファイルを扱う際の重要なポイントです。これを指定しないと、Windows環境で余分な空行が挿入されることがあります。encoding='utf-8'
:日本語などのマルチバイト文字を扱う場合は、文字コードを明示的に指定することが重要です。next(reader)
:イテレータから次の要素(ここでは1行目)を取得します。ヘッダー行をスキップしたい場合や、ヘッダーを別途処理したい場合に便利です。
2. csv.DictReader
で辞書として読み込む
ヘッダー行をキーとして、各行を辞書(OrderedDict
)として読み込みます。データをキーと値のペアで扱いたい場合に非常に便利です。
import csv
# 読み込むCSVファイル名
file_name = "sample_data.csv" # 上記で作成したファイルを使用
# CSVファイルを読み込み(辞書形式)
data_dict = []
with open(file_name, 'r', newline='', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
data_dict.append(row)
print("辞書形式で読み込んだデータ:", data_dict)
# 出力例:
# 辞書形式で読み込んだデータ: [{'名前': 'Alice', '年齢': '30', '都市': '東京'}, {'名前': 'Bob', '年齢': '25', '都市': '大阪'}]
# 特定の要素にアクセス
print(data_dict[0]['名前']) # Alice
CSVファイルを書き込む(出力)
CSVファイルを書き込むには、csv.writer
またはcsv.DictWriter
を使用します。
1. csv.writer
でリストを書き込む
リストのリスト形式のデータをCSVファイルに書き込みます。
import csv
# 書き込むデータ
data_to_write = [
["商品名", "価格", "在庫数"],
["りんご", 150, 100],
["みかん", 120, 200],
["バナナ", 100, 150]
]
# 出力CSVファイル名
output_file = "products.csv"
# CSVファイルに書き込み
with open(output_file, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerows(data_to_write) # 複数の行を一度に書き込む
print(f"'{output_file}' にデータを書き込みました。")
# 書き込んだファイルの中身を確認 (おまけ)
with open(output_file, 'r', encoding='utf-8') as f:
print("\n--- 書き込んだファイルの内容 ---")
print(f.read())
writer.writerow(row)
:1行だけ書き込みます。writer.writerows(rows)
:複数の行(リストのリスト)を一度に書き込みます。
2. csv.DictWriter
で辞書を書き込む
辞書のリスト形式のデータをCSVファイルに書き込みます。辞書のキーがヘッダー行に対応します。
import csv
# 書き込むデータ(辞書のリスト)
data_dict_to_write = [
{"名前": "田中", "年齢": 40, "部署": "営業"},
{"名前": "佐藤", "年齢": 32, "部署": "開発"},
{"名前": "鈴木", "年齢": 28, "部署": "広報"}
]
# フィールド名(ヘッダーとして使用)
fieldnames = ["名前", "年齢", "部署"]
# 出力CSVファイル名
output_file_dict = "employees.csv"
# CSVファイルに書き込み
with open(output_file_dict, 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader() # ヘッダー行を書き込む
writer.writerows(data_dict_to_write) # データを書き込む
print(f"'{output_file_dict}' にデータを書き込みました。")
# 書き込んだファイルの中身を確認 (おまけ)
with open(output_file_dict, 'r', encoding='utf-8') as f:
print("\n--- 書き込んだファイルの内容 ---")
print(f.read())
pandas
でCSVを読み書きする(より高度な操作)
大規模なデータセットや、より複雑なデータ操作が必要な場合は、pandas
ライブラリが非常に強力です。pandas
はデータをDataFrameという表形式で扱い、データのフィルタリング、集計、結合などを簡単に行えます。
pandas
でCSVを読み込む
pd.read_csv()
関数を使用します。
import pandas as pd
# 読み込むCSVファイル名(上記で作成したproducts.csvを使用)
file_name_pd = "products.csv"
# CSVファイルをDataFrameとして読み込み
df = pd.read_csv(file_name_pd)
print("pandasで読み込んだDataFrame:\n", df)
# 出力例:
# pandasで読み込んだDataFrame:
# 商品名 価格 在庫数
# 0 りんご 150 100
# 1 みかん 120 200
# 2 バナナ 100 150
# 特定の列にアクセス
print("\n'商品名' 列:\n", df['商品名'])
pandas
でCSVを書き込む
DataFrame.to_csv()
メソッドを使用します。
import pandas as pd
# 新しいDataFrameを作成
data_for_df = {
'国': ['日本', 'アメリカ', '中国'],
'人口(万人)': [12500, 33000, 140000],
'首都': ['東京', 'ワシントンD.C.', '北京']
}
df_new = pd.DataFrame(data_for_df)
# 出力CSVファイル名
output_file_pd = "countries.csv"
# DataFrameをCSVファイルに書き込み
# index=False: DataFrameのインデックスをCSVに書き込まない
df_new.to_csv(output_file_pd, index=False, encoding='utf-8')
print(f"'{output_file_pd}' にDataFrameを書き込みました。")
# 書き込んだファイルの中身を確認 (おまけ)
with open(output_file_pd, 'r', encoding='utf-8') as f:
print("\n--- 書き込んだファイルの内容 ---")
print(f.read())
index=False
:pandas
が自動で付与する行番号(インデックス)をCSVファイルに書き込まないようにします。header=False
:ヘッダー行を書き込みたくない場合に指定します。
まとめとベストプラクティス
PythonでCSVファイルを読み書きする方法は多岐にわたりますが、プロジェクトの要件に応じて適切なツールを選択することが重要です。
csv
モジュール:シンプルなCSVファイルの読み書き。
行指向の処理、またはメモリ効率が重要な場合。
カスタムな区切り文字や引用符の処理が必要な場合。
pandas
ライブラリ:大規模なデータセットの処理。
複雑なデータ分析、整形、統計処理が必要な場合。
Excel、SQLデータベース、JSONなど、他のデータ形式との連携が多い場合。
どちらの方法を選ぶにしても、encoding='utf-8'
とnewline=''
(csv
モジュールの場合)は、日本語や特殊文字を含むCSVファイルを正しく扱うための重要な設定であることを覚えておきましょう。
CSVファイルの操作は、Pythonを使ったデータ処理の入り口です。ぜひこれらの基本をマスターして、データ活用の幅を広げてください!
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座