Python

【Python】CSVファイルを読み書きする方法【csvモジュール】

この記事では、PythonでCSVファイルを読み書きする方法を解説します。

CSVファイルとは、データや項目などをカンマ(,)で区切って書かれた以下のようなテキストファイルのことを言います。ちなみに拡張子は.csvです。

名前,年齢,性別
田中 慎一,23,男
片岡 理恵,33,女

互換性が高いのでよく使用されます。

それでは、CSVファイルを読み書きする方法を見ていきましょう❗️

CSVファイルを読み書きするには...

PythonでCSVファイルを扱うにはcsvモジュールを使います。csvモジュールは、標準ライブラリなのでインポートするだけで使用可能です。

import csv

Linkcsv --- CSV ファイルの読み書き — Python ドキュメント

CSVファイルを読み込む

CSVファイルを読み込むには、以下の手順で処理をします。

  • STEP1
    ファイルオブジェクトの生成

    open()関数で読み込みたいファイルのファイルオブジェクトを生成します。この時、open()関数のオプションは、'r'を指定しますが、デフォルト値なので記述は必要ありません。csvfileがファイルオブジェクトの場合、 newline=''として開く。

    with open('ファイル名', newline='') as f:
        pass

    open関数を使ってファイルを読み書きする方法

  • STEP2
    readerオブジェクトの生成

    先ほど生成したファイルオブジェクトをcsv.readerコンストラクタの引数として渡し、readerオブジェクトを生成します。

    reader = csv.reader(f)
  • STEP3
    読み込む

    readerオブジェクトは、for文で処理できます。

    for row in reader:
        print(row)

    また、list()tuple()で変換も可能です。

    print(list(reader))
    print(tuple(reader))

試しに、CSVファイルを読み込んでみます。

import csv

with open('data.csv', newline='') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

実行結果

['名前', '年齢', '性別']
['田中 慎一', '23', '男']
['片岡 理恵', '33', '女']

list()で変換すると二次元配列として取得できます。

import csv

with open('data.csv', newline='') as f:
    reader = csv.reader(f)
    print(list(reader))

実行結果

[['名前', '年齢', '性別'], ['田中 慎一', '23', '男'], ['片岡 理恵', '33', '女']]

区切り文字(デミリタ)を指定

csv.readerは、デフォルトでカンマ(,)で区切られますがdelimiter引数を指定することでデミリタを変更することができます。

例えば、以下のような|で区切られたデータがあったとして、

名前|年齢|性別
田中 慎一|23|男
片岡 理恵|33|女

delimiter引数に|を指定すれば、その部分で分割してくれます。

import csv

with open('data.csv', newline='') as f:
    reader = csv.reader(f, delimiter='|')
    print(list(reader))

実行結果

[['名前', '年齢', '性別'], ['田中 慎一', '23', '男'], ['片岡 理恵', '33', '女']]

辞書として読み込む

辞書として読み込みたい場合はcsv.DictReaderを使います。デフォルトでは、keyに1行目の値、valueにそれ以降の値が渡されます。

import csv

with open('data.csv', newline='') as f:
    reader = csv.DictReader(f)
    for row in reader:
        print(row)

実行結果

{'名前': '田中 慎一', '年齢': '23', '性別': '男'}
{'名前': '片岡 理恵', '年齢': '33', '性別': '女'}

fieldnames引数でkeyを指定することもできます。

import csv

with open('data.csv', newline='') as f:
    reader = csv.DictReader(f, fieldnames=('name', 'age', 'gender'))
    for row in reader:
        print(row)

実行結果

{'name': '名前', 'age': '年齢', 'gender': '性別'}
{'name': '田中 慎一', 'age': '23', 'gender': '男'}
{'name': '片岡 理恵', 'age': '33', 'gender': '女'}

Python 3.6 以降ではOrderedDict、3.8以降ではdictとして返されます。

CSVファイルの書き込み

CSVファイルに書き込みを行うには以下の手順で処理をします。

  • STEP1
    ファイルオブジェクトの生成

    open()関数で書き込みたいファイルのファイルオブジェクトを生成します。この時、open()関数のオプションは、新しくファイルを作成する場合 'w'、既に存在するファイルに追記する場合 'a' を指定します。

    with open('ファイル名', 'wかa') as f:
        pass

    open関数を使ってファイルを読み書きする方法

  • STEP2
    writerオブジェクトの生成

    先ほど生成したファイルオブジェクトを csv.writerコンストラクタ の引数として渡し、writerオブジェクト を生成します。

    writer = csv.writer(f)
  • STEP3
    書き込む

    writerオブジェクト の writerowメソッド 使って行単位で書き込むことができます。

    writer.writerow(追加する行)

    複数の行をまとめて追加したい場合は writerowsメソッド を使います。

    writer.writerows(追加する行たち)

試しに、CSVファイルを新しく作成し、書き込んでみます。

import csv

# 書き込むデータ
row = ('田中 慎一', 23,'男')
rows = (('片岡 理恵', 33, '女'), ('川上 陽子', 16, '女'))

with open('data.csv', 'w') as f:
    writer = csv.writer(f)

    # 1行書き込み
    writer.writerow(row)
    # 複数行書き込み
    writer.writerows(rows)

上記コードを実行すると、以下のようなCSVファイルが作成されます。

data.csv

田中 慎一,23,男
片岡 理恵,33,女
川上 陽子,16,女

区切り文字(デミリタ)を指定

デフォルトでは、カンマ区切りでデータが出力されるが、delimiter引数を指定することでデミリタを変更することができます。

import csv

rows = (('田中 慎一', 23,'男'), ('片岡 理恵', 33, '女'), ('川上 陽子', 16, '女'))

with open('data.csv', 'w') as f:
    writer = csv.writer(f, delimiter='|')
    writer.writerows(rows)

上記コードを実行すると、以下のようなCSVファイルが作成されます。

data.csv

田中 慎一|23|男
片岡 理恵|33|女
川上 陽子|16|女

辞書を書き込む

辞書をCSVファイルに書き込むにはcsv.DictWriterを使います。

import csv

p1 = {'名前': '田中 慎一', '年齢': '23', '性別': '男'}
p2 = {'名前': '片岡 理恵', '性別': '女'}

with open('data.csv', 'w') as f:
    # fieldnames引数にkeyの配列を指定
    writer = csv.DictWriter(f, fieldnames=('名前', '年齢', '性別'))

    # fieldnames引数で指定したkeyをヘッダーとして書き込む
    writer.writeheader()

    # writerowメソッドで書き込む(writerowsでもok)
    writer.writerow(p1)
    writer.writerow(p2)

上記のコードを実行すると、以下のようなCSVファイルが作成されます。

data.csv

名前,年齢,性別
田中 慎一,23,男
片岡 理恵,,女

まとめ

この記事では、PythonでCSVファイルを読み書きする方法を解説しました。

CSVファイルは互換性が高いのでそこそこよく使われます。Pythonではモジュールが用意されていて簡単に扱うことができました。

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ