PythonでCSVファイルを読み込み・書き込みする方法を解説!

この記事では『PythonでCSVファイルを読み込み・書き込みする方法』について、

  • Pythonのcsvモジュールとは
  • CSVファイルを読み込みする方法
  • CSVファイルを書き込みする方法
    • 既存のCSVファイルに追記する方法

などをサンプルコードを用いて分かりやすく説明するように心掛けています。ご参考になれば幸いです。

Pythonのcsvモジュールとは

Pythonには、CSVファイルを操作するための標準ライブラリcsvがあります。csvモジュールを用いることで、CSVファイルを読み込み・書き込みすることができます。

公式ドキュメント

csvモジュールの公式ドキュメントのリンクを以下に示します。

この記事では「csvモジュールを用いてCSVファイルを読み込み・書き込みする方法」を分かりやすく説明しています。csvモジュールの詳細を知りたい方は、公式ドキュメントをご覧ください。

CSVファイルを読み込みする方法

一例として以下のCSVファイルexample.csvcsvモジュールを用いて読み込んでみましょう。

Name,Age,City
Taro,30,Tokyo
Yuki,25,Osaka
Hiroshi,35,Nagoya

CSVファイルの読み込みにはcsv.reader()を使います。以下にCSVファイルを読み込むサンプルコードを示します。

# csvモジュールのインポート
import csv

# CSVファイルの読み取り
with open('example.csv', 'r') as file:
    reader = csv.reader(file)
    for row in reader:
        print(row)

# 出力結果
# ['Name', 'Age', 'City']
# ['Taro', '30', 'Tokyo']
# ['Yuki', '25', 'Osaka']
# ['Hiroshi', '35', 'Nagoya']

open()でCSVファイルを開き、ファイルオブジェクトfileを作成しています。open()の第1引数には開くCSVファイルのパス、第2引数には読み込みモードrを指定します。

csv.reader()の第一引数に、ファイルオブジェクトfileを渡すと、readerオブジェクトを作成することができます。

readerオブジェクトは行を反復処理するイテレータです。そのため、for文やnext関数を用いると、readerオブジェクトからデータを1行ごとにリストで取得することができます。

上記のサンプルコードでは、for文でデータを1行ごとにリストで取得しており、rowにはカンマ(,)で区切られたリストが格納されています。

next関数を用いるサンプルコード

next関数を用いたサンプルコードを以下に示します。以下のサンプルコードでは、next関数で最初の1行を読み込み、変数headerに格納しています。その後、for文を用いて、readerオブジェクトからデータを1行ごとにリストで取得しています。

# csvモジュールのインポート
import csv

# CSVファイルの読み取り
with open('example.csv', 'r') as file:
    reader = csv.reader(file)
    # next 関数で最初の1行を読み込んでいる
    header = next(reader)
    print(header)
    for row in reader:
        print(row)

# 出力結果
# ['Name', 'Age', 'City']
# ['Taro', '30', 'Tokyo']
# ['Yuki', '25', 'Osaka']
# ['Hiroshi', '35', 'Nagoya']

ファイルを読み込む際のwith構文について

今まで説明したサンプルコードでは、with構文を用いてファイルを開いています。with構文を用いると、開いたファイルを閉じる処理を省略することができます(with構文から抜け出す際にファイルを閉じてくれるため)。with構文を用いない場合、以下のサンプルコードに示すように閉じる処理が必要です。

# csvモジュールのインポート
import csv

# CSVファイルの読み取り
file = open('example.csv', 'r')
reader = csv.reader(file)
for row in reader:
    print(row)
file.close() # ファイルを閉じる処理が必要

# 出力結果
# ['Name', 'Age', 'City']
# ['Taro', '30', 'Tokyo']
# ['Yuki', '25', 'Osaka']
# ['Hiroshi', '35', 'Nagoya']

CSVファイルを書き込みする方法

CSVファイルの書き込みにはcsv.writer()を使います。以下にCSVファイルを書き込むサンプルコードを示します。

# csvモジュールのインポート
import csv

# CSVファイルに書き込むデータ
data = [
    ["Name", "Age", "City"],
    ["Taro", 30, "Tokyo"],
    ["Yuki", 25, "Osaka"],
    ["Hiroshi", 35, "Nagoya"]
]

# CSVファイルの作成
with open('example.csv', 'w', newline='') as file:
    writer = csv.writer(file)
    writer.writerows(data)

open()でCSVファイルを開き、ファイルオブジェクトfileを作成しています。CSVファイルを新規作成する場合、open()の第1引数には新規のCSVファイルのパス(このパスにCSVファイルが作成されます)、第2引数には書き込みモードwを指定します。

既存のCSVファイルに対して、書き込みモードwを指定すると、上書きされ、元の内容は削除されるので注意してください。CSVファイルを追記する方法は後ほど説明します。

また、open()の第3引数にはnewline=''を指定しています。以下の公式ドキュメントに記載されている通り、Windows環境では改行コードが\r\nなので、行末に余分な\rが追加されてしまいます。そのため、open()の第3引数にnewline=''を指定したほうが安全です(newline=''を指定しない場合の挙動は後ほど説明します)。

newline='' が指定されない場合、クォートされたフィールド内の改行は適切に解釈されず、書き込み時に \r\n を行末に用いる処理系では余分な \r が追加されてしまいます。csv モジュールは独自 (universal) の改行処理を行うため、newline='' を指定することは常に安全です。

https://docs.python.org/ja/3/library/csv.html#id4

csv.writer()の第一引数に、ファイルオブジェクトfileを渡すと、writerオブジェクトを作成することができます。writerオブジェクトのwriterow()メソッドやwriterows()メソッドを用いると、CSVファイルにデータを書き込むことができます。writerow()メソッドの引数には配列を指定し、writerows()メソッドの引数には二次元配列を指定します。なお、上記のサンプルコードではwriterows()メソッドのみを使用しています。

next関数を用いるサンプルコード

writerow()メソッドを用いたサンプルコードを以下に示します。以下のサンプルコードでは、writerow()メソッドでヘッダーを書き込み、writerows()メソッドでデータの中身を書き込んでいます。

# csvモジュールのインポート
import csv

# CSVファイルに書き込むデータ
header = ["Name", "Age", "City"]
data = [
    ["Taro", 30, "Tokyo"],
    ["Yuki", 25, "Osaka"],
    ["Hiroshi", 35, "Nagoya"]
]

# CSVファイルの作成
with open('example.csv', 'w', newline='') as file:
    writer = csv.writer(file)
    writer.writerow(header)  # ヘッダーの書き込み
    writer.writerows(data)  # データの書き込み

CSVファイルを書き込みする際に「newline=''」を指定しない場合

open()の第3引数にnewline=''を指定しない場合のサンプルコードを以下に示します。

import csv

# CSVファイルに書き込むデータ
data = [
    ["Name", "Age", "City"],
    ["Taro", 30, "Tokyo"],
    ["Yuki", 25, "Osaka"],
    ["Hiroshi", 35, "Nagoya"]
]

# CSVファイルの作成
with open('example.csv', 'w') as file:
    writer = csv.writer(file)
    writer.writerows(data)

Windows環境では改行コードが\r\nなので、行末に余分な\rが追加されてしまいます。そのため、Windows環境で上記のサンプルコードを実行し、作成されたCSVファイル(example.csv)を開くと、以下に示すように余分な改行が追加されてしまいます。

Name,Age,City

Taro,30,Tokyo

Yuki,25,Osaka

Hiroshi,35,Nagoya

既存のCSVファイルに追記する方法

既存のCSVファイルに追記したい場合、open()の第2引数に追記モードaを指定します。CSVファイルへの書き込みは新規作成の場合と同じくwriterオブジェクトのwriterow()メソッドやwriterows()メソッドを用います。書き込んだ内容は既存のCSVファイルの末尾に追記されます。

# csvモジュールのインポート
import csv

# CSVファイルに追記するデータ
additional_data = [
    ["Hanako", 28, "Fukuoka"],
    ["Kenji", 32, "Sapporo"]
]

# CSVファイルへの追記
with open('example.csv', 'a', newline='') as file:
    writer = csv.writer(file)
    writer.writerows(additional_data)

本記事のまとめ

この記事では『PythonでCSVファイルを読み込み・書き込みする方法』について、以下の内容を説明しました。

  • Pythonのcsvモジュールとは
  • CSVファイルを読み込みする方法
  • CSVファイルを書き込みする方法
    • 既存のCSVファイルに追記する方法

お読み頂きありがとうございました。