Pythonでテキストファイルの読み込み書き込みをやってきましたが、ここではCSVファイルの読み込みや書き込みをやっていこうと思います。
CSVファイルはカンマ区切りによってデータを書き込まれたテキストファイルで、データベースの取り込みなどでよく使われます。エクセルファイルなどの表計算ソフトなどでも開くことができます。
ここではPythonでCSVファイルの作成、書き込み、読み込みを学びます。
さっそくPythonでCSVファイルを扱ってみましょう。
リストのリストデータからCSVファイルを作る
PythonでCSVファイルを扱うにはcsvライブラリをインポートして使います。
まず行のリストの読み書きをしてみましょう。
import csv # csvをimport
gundam = [ # 列のリストが含まれている行のリスト
["Setsuna", "EXIA"],
["Lockon", "DYNAMES"],
["Allelujah", "KYRIOS"],
["Tieria", "VIRTUE"],
]
with open("ms.csv", "w") as f: # ファイル名をms.csvとする
msout = csv.writer(f) # ファイルを書き込むためのオブジェクトにする
msout.writerows(gundam) # ファイルにリストを書き込む
まず、csvライブラリをインポートします。ここではリストのリストを使ってCSVファイルを作ります。withステートメント、モード”w”でファイル名ms.csvを作ります。ファイルに書き込むためのオブジェクトにして、wrterows()でリストをファイルに書き込みます。
コードを実行するとこうなります。(Pythonファイル名はcsv_file.pyでAtomで実行しています)
ファイルが作成されて、カンマ区切りでデータが収められているのがわかります。
CSVファイルを読み込む
次は、この作成したCSVファイルを読みだしてターミナルに出力してみることにします。
コードをこのように変えてみましょう。
import csv
with open("ms.csv", "r") as f: # モードを"r"にして読み込む
msout = csv.reader(f) # 読み込みオブジェクトにする
gundam = [row for row in msout] # ここでは内包表記を使ってループで要素を取り出します。
print(gundam)
ファイルの読み込みなのでモードを”r”にしてファイルを開きます。reader()で読み込みオブジェクトにして、要素を内包表記を使って取り出し、printで出力しています。
実行するとこうなります。
もとのリストのリストとして表示されているのがわかります。
ここまでは、データがリストのリストを使ってCSVファイルを作りました。
これを辞書型のデータで読み出してみます。
import csv
with open("ms.csv", "r") as f:
fieldnames = ["pilot", "Mobile Suit"] # フィールド名を設定する
msout = csv.DictReader(f, fieldnames=fieldnames) #DictReaderでオブジェクト化
gundam = [row for row in msout]
print(gundam)
ここではフィールド名を設定しています。辞書型データのキーに当たるものです。これをfieldnamesとして設定します。DictReaderで辞書型で読み込みます。ここも内包表記で要素を取り出して出力しました。
実行するとこうなります。
ここでは、少し見にくいですが、OderedDict型の辞書型として出力されました。ちょっと見にくいですね。Pythonのバージョンが古いと、波括弧の辞書型を含むリストで表示されるはずです。
辞書型データでCSVファイルを作る
次は、辞書型のデータを使ってCSVファイルを作ってみましょう。
今まで使っているガンダムのネタで作って行きます。
import csv
with open("ms.csv", "w") as f:
fieldnames = ["pilot", "Mobile Suit"] # フィールド名を設定
msout = csv.DictWriter(f, fieldnames=fieldnames) # DictWriterでオブジェクト化
msout.writeheader() # ヘッダー名をセットすることでフィールド名が利用されます。
msout.writerow({"pilot": "Setsuna", "Mobile Suit": "EXIA"}) # 辞書型で書き込む
msout.writerow({"pilot": "Lockon", "Mobile Suit": "DYNAMES"})
msout.writerow({"pilot": "Allelujah", "Mobile Suit": "KYRIOS"})
msout.writerow({"pilot": "Tieria", "Mobile Suit": "VIRTUE"})
書き込みなのでモードを “w”に設定します。フィールド名を設定してデータのヘッダーとして利用します。DictWriterでファイルをオブジェクト化し、ヘッダーをセットします。writerow()を使って1行づつ辞書型データを書き込んで行きます。
実行するとこうなります。
作成されたCSVファイル(右上)にデータのヘッダーが作成されているのがわかります。
このコードは次のように書き換えることもできます。
import csv
gundam = [ # 辞書型データを持つリスト
{"pilot": "Setsuna", "Mobile Suit": "EXIA"},
{"pilot": "Lockon", "Mobile Suit": "DYNAMES"},
{"pilot": "Allelujah", "Mobile Suit": "KYRIOS"},
{"pilot": "Tieria", "Mobile Suit": "VIRTUE"},
]
with open("ms.csv", "w") as f:
fieldnames = ["pilot", "Mobile Suit"]
msout = csv.DictWriter(f, fieldnames=fieldnames)
msout.writeheader()
msout.writerows(gundam) # writerowではなくwriterrowsであることに注意
書き込む時に複数行を書き込む訳ですから、writerow()ではなくwriterows()であることに注意です。
再度、CSVファイルを読み込む
再度、このCSVファイルを読み込んでみましょう。フィールド名のあるファイルですから、上でやったように普通に出力するとOrderedDictで出力されます。
ここでは少し変えてみます。
import csv
with open("ms.csv", "r") as f:
msout = csv.DictReader(f)
for row in msout: # ここではfor-inループで要素を取り出ししてみました
print(row["pilot"],row["Mobile Suit"]) # キーを指定して出力します
内包表記でもよかったのですが、ここではfor文を使って要素を取り出しています。
データにはフィールド名が設定されています。それは辞書型データのキーに当たりますから、printにはそれぞれキーを指定して出力しています。
実行するとこうなります。
値の部分だけ取り出して出力されているのがわかります。
まとめ
PythonでCSVファイルの読み込み書き込みもできます。csvライブラリをインポートすることでファイルの操作が簡単に行えます。
CSVファイルはカンマ区切りによってデータを書き込まれたテキストファイルで、データベースとのやり取りや、エクセルなどの表計算ソフトで開くこともできるファイルです。
Pythonでは、リストを持ったリストデータを読み込むことで、CSVファイルを作成し、読み込み書き込みをすることができます。
CSVファイルにヘッダーが必要な場合は、辞書型データでファイルに書き込むことによって作成することができます。辞書型データのキーに当たる部分がヘッダーとしてfieidnamesとして利用されます。
fieldnamesのある辞書型で読み出す場合は、OderedDict型で出力されます。