【Python】CSVファイル操作の決定版!csvモジュールの基本を徹底解説

こんにちは。ゆうせいです。

エンジニアの仕事をしていると、Excelのような表形式のデータをプログラムで扱いたい場面が本当によく出てきます。顧客リスト、売上データ、アンケート結果…。これらの多くは「CSVファイル」という形式で保存されています。

「CSVファイルって、ただカンマで区切られたテキストでしょ?自分で一行ずつ読み込んで、カンマで分割すればいいや」なんて思っていませんか?実はそれ、思わぬ落とし穴にはまることがあるんです!

そこで登場するのが、Pythonの「csvモジュール」です。このモジュールは、CSVファイルを手間なく、そして安全に読み書きするための専用ツール。今日は、新人エンジニアのあなたがCSV操作の達人になるための第一歩を、一緒に踏み出しましょう!

CSVファイルとcsvモジュールの基本

まず、「CSV」が何の略か知っていますか?これは「Comma-Separated Values」の略で、その名の通り「カンマで区切られた値」という意味です。表の各セルにあるデータをカンマで区切り、一行を一つのデータレコードとして表現した、とてもシンプルなテキストファイルなんです。

このシンプルさがゆえに、多くのアプリケーションでデータの受け渡しに使われています。

そして、Pythonのcsvモジュールは、このCSVファイルを賢く扱うための専門家です。例えば、データの中にカンマが含まれている場合("山田, 太郎"さんのような名前とか)でも、それが区切り文字なのか、データの一部なのかを正しく見分けてくれます。すごいでしょう?

csvモジュールでファイルを「読み込む」

まずは、既存のCSVファイルを読み込む方法から見ていきましょう。ここに、簡単なユーザーリスト users.csv があるとします。

id,name,email
1,Sato,sato@example.com
2,Suzuki,suzuki@example.com
3,Takahashi,takahashi@example.com

このファイルをPythonで読み込むコードはこうなります。

import csv

with open('users.csv', 'r', encoding='utf-8') as f:
    reader = csv.reader(f)
    
    # readerオブジェクトから一行ずつデータを取得してループ
    for row in reader:
        print(row)

これを実行すると、こんな結果が表示されます。

['id', 'name', 'email']
['1', 'Sato', 'sato@example.com']
['2', 'Suzuki', 'suzuki@example.com']
['3', 'Takahashi', 'takahashi@example.com']



csv.reader(f) という部分がポイントです。これはファイルオブジェクト f を、CSVのルールを理解してくれる「readerオブジェクト」に変換しています。この reader は、一行をカンマで分割して、文字列のリストとして返してくれるんです。自分で分割処理を書くより、ずっと簡単で確実だと思いませんか?

一つ注意点!読み込んだデータは、たとえ数字であってもすべて「文字列」として扱われます。もしIDを使って計算したい場合は、int(row[0]) のように自分で数値に変換するのを忘れないでくださいね。

csvモジュールでファイルに「書き込む」

次に、プログラムで作成したデータを新しいCSVファイルに書き出してみましょう。

import csv

# 書き出したいデータ(リストのリスト)
user_data = [
    ['id', 'name', 'email'],
    [1, 'Tanaka', 'tanaka@example.com'],
    [2, 'Ito', 'ito@example.com']
]

with open('new_users.csv', 'w', encoding='utf-8', newline='') as f:
    writer = csv.writer(f)
    
    # 複数の行を一度に書き込む
    writer.writerows(user_data)

print("new_users.csv を作成しました!")

今度は csv.writer(f) を使って「writerオブジェクト」を作成します。そして writer.writerows() メソッドを使えば、リストのリスト形式のデータを一気にCSVファイルへ書き込めます。一行だけ書きたい場合は writer.writerow() を使います。

ここで、open() の中にある newline='' というおまじないが重要です。これがないと、書き出したCSVファイルの行と行の間に、不要な空行が入ってしまうことがあるのです。CSVファイルへ書き込むときは、必ずこのオプションを付ける、と覚えてしまいましょう!

ヘッダーを辞書として扱う、もっと便利な方法

CSVファイルの1行目は、各列が何を表すかを示す「ヘッダー」になっていることが多いですよね。

csv.DictReader を使うと、このヘッダーをキーとした辞書(dict)の形式でデータを扱えるようになり、コードが格段に分かりやすくなります。

import csv

with open('users.csv', 'r', encoding='utf-8') as f:
    # DictReaderを使う
    reader = csv.DictReader(f)
    
    for row in reader:
        # 添字の数字ではなく、列名でアクセスできる!
        print(f"ID: {row['id']}, Name: {row['name']}")

row[0]row[1] のように数字でアクセスするよりも、row['id']row['name'] のように列の名前でアクセスできる方が、コードの意味が断然分かりやすいですよね。これはぜひ使ってほしいテクニックです!書き込み用の csv.DictWriter もありますよ。

まとめと次のステップ

今回はPythonのcsvモジュールの基本的な使い方を解説しました。

  • csv.reader: CSVファイルを読み込み、一行をリストとして取得する。
  • csv.writer: リスト形式のデータをCSVファイルに書き込む。
  • csv.DictReader: ヘッダー行をキーにした辞書としてデータを読み込む。

この基本をマスターすれば、日常業務で発生する多くのデータ処理タスクを自動化できるようになるはずです。

そして、もしあなたがCSVファイルを使った、より高度なデータ集計や分析、統計処理に挑戦したくなったら、そのときは「pandas」というライブラリの扉を叩いてみてください。pandasは、csvモジュールよりもはるかにパワフルなデータ操作機能を提供してくれます。

まずはcsvモジュールで基本を固め、自信がついたら次のステップへ進む!この順番で学習を進めていくのがおすすめですよ。頑張ってください!

Python csvモジュールの主な機能まとめ

クラス/関数主な役割
csv.reader(ファイル)CSVファイルを読み込むための「リーダー」を作成します。一行を文字列のリストとして扱います。
csv.writer(ファイル)CSVファイルへ書き込むための「ライター」を作成します。
(ライター).writerow(リスト)ライターを使って、1行分のデータ(リスト形式)をファイルに書き込みます。
(ライター).writerows(リストのリスト)ライターを使って、複数行のデータ(リストのリスト形式)をまとめてファイルに書き込みます。
csv.DictReader(ファイル)1行目のヘッダーをキーとした辞書の形で、一行ずつデータを読み込むリーダーを作成します。
csv.DictWriter(ファイル, fieldnames)辞書形式のデータをCSVファイルへ書き込むためのライターを作成します。

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。