ここではデータを扱う際に必ずと言っていいほど使うCSVファイルの、Pythonでの扱い方について解説していきます。
内容としては、
・CSVファイルの読み込み
・CSVファイルの内容の追加
・CSVファイルの書き込み
この3つになります。
CSVファイルの読み込み
データ分析、売上管理、在庫管理など、こういったデータはCSVが使われることもかなり多いです。
このCSVファイルをPythonで扱うためには、
【標準ライブラリのcsvモジュール】こちらを使えば、簡単にCSVファイルを扱うことが出来ます。
例としてはこんな感じです。
import csv
csv_file = 'example.csv'
with open(csv_file, mode='r', encoding='utf-8') as f:
rows = list(csv.reader(f))
with open() as f:と書かれることが、かなり多いです。
fについては、開いたファイルを扱う変数名みたいなものなので、変更できます。
カッコ内の内容については
- csvのパス
- mode:ファイルの扱い
- encoding:ファイルの文字コード
modeについては、
| モード | 内容 |
|---|---|
| r | 読みこみ専用で開く |
| w | 書き込み専用で開く |
| x | 新規作成で開く |
| a | 末尾に追記するモード |
他にもあるのですが、基本は
- r:読みこみ専用
- w:書き込み専用
この2つがほとんどになるかなと思います。
ヘッダーをキーにして辞書で取得
CSVなどのデータを保存するファイルは、その列のデータが何を表しているかをヘッダーに書いてあることがほとんどです。
こういった感じですね。
customer_id,customer_name,email
C001,山田 太郎 ,YAMADA@example.com
C002, 佐藤 花子,sato@example.com
C003,鈴木一郎,suzuki@example.com
この時にCSVモジュールのDictReaderというものを使うと管理がしやすいです。
コードはこういった感じです。
import csv
csv_name = 'example.csv'
with open(csv_name, mode='r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
print(row)
# 出力
# →{'customer_id': 'C001', 'customer_name': '山田 太郎 ', 'email': 'YAMADA@example.com'}
コード部分に書いてあるように、ヘッダーの値をキーとしてバリューに値をいれた辞書型で出力されています。
この形もかなり使うので、覚えておいてくださいね。
ヘッダーを飛ばす
個人で開発をする場合には、むしろヘッダーを飛ばしてリストで処理するということをやったりもします。
その場合には、
import csv
csv_name = 'example.csv'
with open(csv_name, mode='r', encoding='utf-8') as f:
reader = csv.reader(f)
header = next(reader)
for row in reader:
print(row)
# 出力→['C001', '山田 太郎 ', 'YAMADA@example.com']
header = next(reader)部分がヘッダーを飛ばす処理になります。
上でDictReaderで処理していた部分をreaderで処理して、1行ずつリスト化。
最初の行はヘッダーなので、nextで飛ばす。
2行目からfor文を使って、取得するという書き方です。
CSVファイルへ内容を追加
次はCSVファイルへ内容を追記する方法です。
この時に使うモードとしては【a】で末尾に追加を使うことが、多いです。
【r+】というモードで先頭や途中に追加したりも出来るのですが、この場合には、
- rモードでCSVを読みこむ
- rモードで取得したデータと追加したいデータを結合
- wモードで書き出し
という形でやった方が、間違いがないです。
なので「データを常に取得して更新し続ける」みたいな場合に、このaモードが使えます。
限定的な使い方なのですが、プログラムでデータ更新というのは日常的に行われます。
後の書き込みで話すように【r→w】で全く同じことが出来ますが、aモードも覚えておくと便利です。
実際にはこんな形ですね。
import csv
csv_name = 'example.csv'
add_list = ['12345', '234567', '345678']
with open(csv_name, mode='a', encoding='utf-8') as f:
for item in add_list:
f.write(item + '\n')
f.write(item + ‘\n’)
この\nは、改行の意味になります。
1行だけ追加する場合には、f.write(‘追加文字列’)みたいな形のみでいいのですが、、
今回の様にリストの中身を取り出して、追加したいという場合には、改行をいれないと1行で全部入ってしまいます。
CSVの書き込み
CSVの書き込みはwモードで開いて実行します。
コードとしては以下のような感じです。
import csv
header = [
'order_id',
'order_date',
'customer_id',
'customer_name',
'email',
'product_id',
'product_name',
'quantity',
'total_price',
]
data = [
[1001, "2026-02-10", "C001", "山田 太郎", "taro@example.com", "P101", "ワイヤレスマウス", 1, 2980],
[1002, "2026-02-11", "C002", "佐藤 花子", "hanako@example.com", "P205", "メカニカルキーボード", 1, 12800],
[1003, "2026-02-12", "C003", "鈴木 一郎", "ichiro@example.com", "P310", "USB-Cハブ", 2, 3960],
[1004, "2026-02-13", "C004", "田中 美咲", "misaki@example.com", "P415", "ノートPCスタンド", 1, 4500],
[1005, "2026-02-14", "C005", "高橋 健", "ken@example.com", "P512", "外付けSSD 1TB", 1, 15800],
]
with open("orders.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f, delimiter=",")
writer.writerow(header)
writer.writerows(data)
ここでやっている内容としては
- headerを作成
- dataを作成
- with openでwモードでcsvファイルを開く
- writerで書き込み方法を決める
- ヘッダーの書き込み
- dataを1行ずつ書き込み
という流れで進んでいます。
ここで新しく出てきているのが、
- with openの引数としてのnewline
- delimiter
この2つですが、各役割としては、
newlineは1行入力した後の挙動です。
newline=""を入れておかないと、データ→1行の改行→データという感じで無駄な改行が入ってしまいます。
delimiterは区切り文字です。
CSVファイルの場合には基本的にカンマ(,)で区切りますが、テキストファイルなどでタブ区切り(\t)で区切りたい場合も出てきます。
その時に何で区切るかを決定するのがdelimiterになります。
読みこみと書き込み実践
動画でCSVの使い方から、実践的な解説をしています。
その中で作ったコードは以下になります。
import csv
# 1.文字コードを指定してCSVファイルを読みこんでデータを確認する
def load_customers(csv_name, encoding):
customer_dic = {}
with open(csv_name, mode='r', encoding=encoding) as f:
reader = csv.DictReader(f)
for row in reader:
customer_id = row['customer_id']
customer_name = row['customer_name'].replace(' ', '').replace(' ', '')
email = row['email']
customer_dic[customer_id] = {'name': customer_name, 'email': email}
return customer_dic
def load_products(csv_name, encoding):
product_dic = {}
with open(csv_name, mode='r', encoding=encoding) as f:
reader = csv.DictReader(f)
for row in reader:
product_id = row['product_id']
product_name = row['product_name']
product_price = row['product_price']
product_dic[product_id] = {'product_name': product_name,
'product_price': product_price}
return product_dic
def load_orders(csv_name, encoding):
order_dic = {}
with open(csv_name, mode='r', encoding=encoding) as f:
reader = csv.DictReader(f)
for row in reader:
order_id = row['order_id']
order_date = row['order_date']
customer_id = row['customer_id']
product_id = row['product_id']
quantity = row['quantity']
# customer_idで注文をまとめたい
if customer_id in order_dic:
order_dic[customer_id].append({'order_id': order_id,
'order_date': order_date,
'product_id': product_id,
'quantity': quantity}
)
else:
order_dic[customer_id] = [{'order_id': order_id,
'order_date': order_date,
'product_id': product_id,
'quantity': quantity}
]
return order_dic
# 2.読みこんだordersデータから、他のデータを照合して出力データを作る
def make_out_data(customers, products, orders):
# customersからidを取得して、注文内容をまとめていく
out_data = []
for customer_id, customer_data in customers.items():
customer_name = customer_data['name']
customer_email = customer_data['email']
# 現在のカスタマーが注文しているか確認し、注文情報を取得
if customer_id in orders:
customer_orders = orders[customer_id]
for customer_order in customer_orders:
# 出力情報を変数に入れる
order_id = customer_order['order_id']
order_date = customer_order['order_date']
product_id = customer_order['product_id']
quantity = customer_order['quantity']
# productsから商品情報を取得
product = products[product_id]
product_name = product['product_name']
product_price = product['product_price']
total_price = int(product_price) * int(quantity)
order_data = [order_id,
order_date,
customer_id,
customer_name,
customer_email,
product_id,
product_name,
quantity,
total_price,
]
out_data.append(order_data)
return out_data
# 3.出力データでoutput_data.csvファイルを出力
def out_csv(out_data, out_csv_name, encoding):
header = ['order_id',
'order_date',
'customer_id',
'customer_name',
'email',
'product_id',
'product_name',
'quantity',
'total_price',
]
with open(out_csv_name, mode='w', encoding=encoding, newline='') as f:
writer = csv.writer(f, delimiter=',')
writer.writerow(header)
writer.writerows(out_data)
if __name__ == '__main__':
customers_csv = 'customers.csv'
products_csv = 'products.csv'
orders_csv = 'orders.csv'
out_csv_name = 'out_data.csv'
customers = load_customers(customers_csv, encoding='cp932')
products = load_products(products_csv, encoding='cp932')
orders = load_orders(orders_csv, encoding='utf-8')
out_data = make_out_data(customers, products, orders)
out_csv(out_data, out_csv_name, 'utf-8')
使用しているCSVファイルは
customer_id,customer_name,email
C001,山田 太郎 ,YAMADA@example.com
C002, 佐藤 花子,sato@example.com
C003,鈴木 一郎,suzuki@example.com
C004,高橋 美咲,takahashi@example.com
C005,伊藤 健,ito@example.com
C006,渡辺 彩,watanabe@example.com
C007,中村 翔,nakamura@example.com
C008,小林 優子,kobayashi@example.com
C009,加藤 大輔,kato@example.com
C010,吉田 真央,yoshida@example.com
product_id,product_name,product_price
P001,Python基礎講座,10000
P002,CSV実践講座,8000
P003,データ整形講座,12000
P004,自動化テンプレート,5000
P005,応用PDF講座,15000
order_id,order_date,customer_id,product_id,quantity
O001,2026/02/01,C001,P001,1
O002,2026/02/02,C002,P002,2
O003,2026/02/03,C003,P003,1
O004,2026/02/04,C004,P004,3
O005,2026/02/05,C005,P005,1
O006,2026/02/06,C006,P001,2
O007,2026/02/07,C007,P002,1
O008,2026/02/08,C008,P003,1
O009,2026/02/09,C009,P004,4
O010,2026/02/10,C010,P005,2
O011,2026/02/11,C001,P002,1
O012,2026/02/12,C002,P003,2
O013,2026/02/13,C003,P004,1
O014,2026/02/14,C004,P005,1
O015,2026/02/15,C005,P001,3
O016,2026/02/16,C006,P002,1
O017,2026/02/17,C007,P003,2
O018,2026/02/18,C008,P004,2
O019,2026/02/19,C009,P005,1
O020,2026/02/20,C010,P001,1
CSVファイルの文字コードは以下で作成しています。
- customers.csv:shift-jis
- products.csv:shift-jis
- orders.csv:utf-8
やっている内容を解説すると、、
load_csvファイル
ここではencodingで文字コードを指定してファイルを読みこんで、辞書でデータを返しています。
簡単に開発をする時には、読みこみのところで解説した、ヘッダー飛ばしでリスト化して返すことも多いです。
今回は丁寧にやるため、全て辞書で返しています。
make_out_data
ここでは最終的に出力をするためのデータを3つのCSVファイルから読み取ったデータをもとに作成しています。
まずcustomerのCSVファイルから取得した顧客情報に入っているIDを取得します。
その取得したIDが注文をしているのかをordersに存在しているかを判断。
その上で注文がある場合には、ordersの中のデータを処理して、最終的にout_dataの中にリストとして保管しています。
out_csv
ここはmake_out_dataで作成したリストでCSVファイルを出力しています。
引数として受け取っているout_dataのリストの中にはヘッダー情報がないです。
そのため最初にヘッダー情報作っています。
その上でwモードで開いて新規で作成。
writerでdelimiterをカンマで指定して、まずはヘッダーを書き込み。
さらにout_dataに入っているリストを1行ずつ書き込んでいます。
今回はPythonでCSVファイルの扱う方法について解説してきました。
webアプリなどを使用する場合には、データはDBで管理することが多いです。
でも自社システムなどでローカルでの管理の時には、CSVファイルで管理することもかなりあります。
データの管理はプログラムで必ずやる部分なので、ぜひ覚えていってくださいね。
●Python講座一覧ページ