【Python講座:CSVモジュール】実務で必ず使うCSV操作3選


Python
投稿日:
【Python講座:CSVモジュール】実務で必ず使うCSV操作3選

ここではデータを扱う際に必ずと言っていいほど使うCSVファイルの、Pythonでの扱い方について解説していきます。

内容としては、

・CSVファイルの読み込み

・CSVファイルの内容の追加

・CSVファイルの書き込み

この3つになります。

CSVファイルの読み込み

データ分析、売上管理、在庫管理など、こういったデータはCSVが使われることもかなり多いです。

このCSVファイルをPythonで扱うためには、

【標準ライブラリのcsvモジュール】

こちらを使えば、簡単にCSVファイルを扱うことが出来ます。

例としてはこんな感じです。

コード: python
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などのデータを保存するファイルは、その列のデータが何を表しているかをヘッダーに書いてあることがほとんどです。

こういった感じですね。

コード: example.csv
customer_id,customer_name,email
C001,山田 太郎 ,YAMADA@example.com
C002, 佐藤 花子,sato@example.com
C003,鈴木一郎,suzuki@example.com

この時にCSVモジュールのDictReaderというものを使うと管理がしやすいです。

コードはこういった感じです。

コード: python
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'}

コード部分に書いてあるように、ヘッダーの値をキーとしてバリューに値をいれた辞書型で出力されています。

この形もかなり使うので、覚えておいてくださいね。

ヘッダーを飛ばす

個人で開発をする場合には、むしろヘッダーを飛ばしてリストで処理するということをやったりもします。

その場合には、

コード: python
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モードも覚えておくと便利です。

実際にはこんな形ですね。

コード: python
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モードで開いて実行します。

コードとしては以下のような感じです。

コード: python
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の使い方から、実践的な解説をしています。

その中で作ったコードは以下になります。

コード: python
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ファイルは

コード: customers.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
コード: products.csv
product_id,product_name,product_price
P001,Python基礎講座,10000
P002,CSV実践講座,8000
P003,データ整形講座,12000
P004,自動化テンプレート,5000
P005,応用PDF講座,15000
コード: orders.csv
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講座一覧ページ

Python講座一覧~四則演算・変数・for文・if文~
Python
2026/02/05
Python講座一覧~四則演算・変数・for文・if文~
質問はこちら
もし今回のことやプログラミングについて分からないことがあれば、回答していくので、気軽に以下から聞いてくださいね。
> 質問募集中です!

※頂いた質問は動画コンテンツとして回答していく予定です。



All Categories

Advertisement