この記事では、PythonでCSVファイルを読み書きする方法を解説します。
CSVファイルとは、項目やデータなどをカンマ(,)
で区切って書かれたテキストファイルのことを言います。ちなみに拡張子は.csv
です。
互換性が高いのでよく使用されます。
それでは、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
-
STEP2readerオブジェクトの生成
先ほど生成したファイルオブジェクトを
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', '女']
reader
オブジェクトを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
-
STEP2writerオブジェクトの生成
先ほど生成したファイルオブジェクトを
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ではモジュールが用意されていて簡単に扱うことができました。
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ