前回の記事でPythonの標準ライブラリの中から日付(datetime)モジュールについて、その利用方法を説明しました。
今回も、Pythonの標準ライブラリの中から汎用性の高いものについてピックアップして学んでいきたいと思います。
今回はCSVファイル操作に関するモジュールを紹介します。
- Pythonの標準ライブラリの使い方がわかる
- CSVファイル操作(csv)のモジュールについての使い方が分かる
csvモジュールについて
以前の記事でテキストファイルの操作について説明しました。
ですが、プログラムで使うファイルというのは一般的なテキストファイル(.txt)ばかりではありませんし、その他の決まった形式で整形されたデータが保存されているファイルを利用したい場合もあります。
特にプログラムでよく使われるフォーマットとして「CSVファイル」があります。
Pythonでは標準ライブラリとしてcsvモジュールが用意されていますので、そちらでcsvファイルの操作を行います。
CSVファイルとは
CSVファイルとは「Comma-Separated Values」の略で、カンマで1つ1つのデータを区切って記述されたファイルです。
特にExcelなどの表計算ソフトやデータベースソフトのデータ交換などによく使われるフォーマットです。
具体的なCSVファイルはこんな感じ。
全国地方公共団体コード,郵便番号,都道府県名,市区町村名,町域名,都道府県名,市区町村名,町域名
13101,"1000000","トウキョウト","チヨダク","イカニケイサイガナイバアイ","東京都","千代田区","以下に掲載がない場合"
13101,"1020072","トウキョウト","チヨダク","イイダバシ","東京都","千代田区","飯田橋"
13101,"1020082","トウキョウト","チヨダク","イチバンチョウ","東京都","千代田区","一番町"
13101,"1010032","トウキョウト","チヨダク","イワモトチョウ","東京都","千代田区","岩本町"
13101,"1010047","トウキョウト","チヨダク","ウチカンダ","東京都","千代田区","内神田"
このCSVファイルをPythonで読み込んで処理できれば、例えば表計算ソフトやデータベースのデータを読み込んで処理するプログラムを作成することが出来ます。
CSVファイルを操作できれば、Excelデータを使った処理など業務にリンクしたような実用性のあるプログラムを作ることができるね
csvモジュールの関数
CSVファイルに関する機能は標準ライブラリのcsvモジュールとして用意されています。
この中にはCSVデータの読み込みや書き出しに関する関数やクラスが用意されていますが、特に重要になるのが以下の2つの関数です。
関数 | 役割 |
---|---|
reader | CSVフォーマットのデータを読み込むためのインスタンスを作成する |
writer | CSVフォーマットのデータを書き出すためのインスタンスを作成する |
これらの関数を使ってインスタンスを作成し、そのインスタンスのメソッドを呼び出してCSVデータを操作します。
ただ注意が必要なのが、CSVファイルのアクセス自体はopen関数を使用します。
- CSVファイルにアクセスする→open関数を使う
- アクセスしたCSVファイルを操作する→csvモジュールを使う
この点は理解しておきましょう。
あくまでCSVファイルを読み込んだりCSVファイルとして書き込むのはopen関数を使います、open関数を経由してCSVファイルを操作する仕組みとしてcsvモジュールがあるイメージです
ちょっと分かりにくいですが、具体的な例はプログラムを作って説明します。
readerでCSVファイルを読み込む
では、実際にCSVファイルを読み込んでみましょう。
読み込む際には以下のような手順を踏みます。
- open関数を使いCSVファイルを開く
- reader関数を使いreaderインスタンスを作成する
- readerインスタンスをfor文で処理する
open関数でファイルを開く手順としては、以前説明したテキストファイルと同じです。
それからcsvモジュールで用意されているreader関数を使い、CSVデータを処理するreaderインスタンスを作成します。
このインスタンスを使ってfor文を回しCSVのデータを順番に取り出していきます。
ではreader関数を見ていきましょう。
各キーワード引数の説明は以下です。
キーワード引数 | 説明 | デフォルト値 |
---|---|---|
delimiter | データ区切り文字 | ’,’ |
doublequote | データ内のクォートを二重化 | True |
escapechar | エスケープ文字 | None |
lineterminator | 行の区切り文字 | ‘\r\n’ |
quotechar | クォート記号の文字 | ‘ ” ‘ |
skipinitialspace | データ冒頭のスペース除去 | False |
第1引数のファイルは、open関数で取得したファイルのインスタンスをそのまま指定します。
またキーワード引数がたくさん用意されていますが、これらはデフォルト値が決まっているので、デフォルトのままでよければ特に指定は不要です。
こちらはCSVファイルのデータに合わせて適宜設定してください。
CSVファイルを用意する
では実際にCSVファイルからデータを読み込んでみましょう。
CSVファイルは先ほどの「sample.csv」を使いますので、CSVファイルをPythonの実行ファイルと同じ場所に格納します。
全国地方公共団体コード,郵便番号,都道府県名,市区町村名,町域名,都道府県名,市区町村名,町域名
13101,"1000000","トウキョウト","チヨダク","イカニケイサイガナイバアイ","東京都","千代田区","以下に掲載がない場合"
13101,"1020072","トウキョウト","チヨダク","イイダバシ","東京都","千代田区","飯田橋"
13101,"1020082","トウキョウト","チヨダク","イチバンチョウ","東京都","千代田区","一番町"
13101,"1010032","トウキョウト","チヨダク","イワモトチョウ","東京都","千代田区","岩本町"
13101,"1010047","トウキョウト","チヨダク","ウチカンダ","東京都","千代田区","内神田"
CSVファイルの内容を表示する
では上記CSVファイルを読み込み、データを表示してみましょう。
import csv
with open("sample.csv",encoding="utf-8") as file:
filereader = csv.reader(file)
for row in filereader:
print(row)
3行目のopen関数で CSVファイルを読み込みます。
ここで CSVファイルは日本語を含みますので、文字コードにユニコード指定してファイルをopenします。
ここは以前ファイル操作の時にやった手順と同じですね
4行目でcsvモジュールのreader関数で引数にfileを指定して、readerインスタンスを作成します。
そして5行目以降でreaderインスタンスから読み込んだデータをfor文で1行単位で表示しています。
実行した結果は以下です。
['全国地方公共団体コード', '郵便番号', '都道府県名', '市区町村名', '町域名', '都道府県名', '市区町村名', '町域名']
['13101', '1000000', 'トウキョウト', 'チヨダク', 'イカニケイサイガナイバアイ', '東京都', '千代田区', '以下に掲載がない場合']
['13101', '1020072', 'トウキョウト', 'チヨダク', 'イイダバシ', '東京都', '千代田区', '飯田橋']
['13101', '1020082', 'トウキョウト', 'チヨダク', 'イチバンチョウ', '東京都', '千代田区', '一番町']
['13101', '1010032', 'トウキョウト', 'チヨダク', 'イワモトチョウ', '東京都', '千代田区', '岩本町']
['13101', '1010047', 'トウキョウト', 'チヨダク', 'ウチカンダ', '東京都', '千代田区', '内神田']
CSVファイルのデータが正しく読み込まれていることが分かります。
また表示されているデータの内容を見ると以下のように読み込まれていることが分かります。
- データは1行ずつまとめられている。
- 各行のデータは項目がリストにまとまって取り出される。
- 各項目の値は全て文字列データとして扱われる。
CSVファイルの保存
では、今度はCSVファイルに保存してみましょう。
これには以下のような手順を踏みます。
- open関数を使いCSVファイルを開く
- writer関数を使いwriterインスタンスを作成する
- writerインスタンスのメソッドを使いデータを書き出す
基本的な流れはCSVファイルの読み込みと同じです
まずopen関数でファイルを開きます。
それからcsvモジュールで用意されているwriter関数を使い、CSVデータを処理するwriterインスタンスを作成します。
このインスタンスのメソッドを使いCSVデータをファイルに追記していきます。
ではwriter関数を見ていきましょう。
各キーワード引数の説明は以下です。
キーワード引数 | 説明 | デフォルト値 |
---|---|---|
delimiter | データ区切り文字 | ’,’ |
doublequote | データ内のクォートを二重化 | True |
escapechar | エスケープ文字 | None |
lineterminator | 行の区切り文字 | ‘\r\n’ |
quotechar | クォート記号の文字 | ‘ ” ‘ |
skipinitialspace | データ冒頭のスペース除去 | False |
quoting | クォートの方針(※) | csv.QUOTE_MINIMAL |
※クォートの方針については以下の4つの値が設定可能です。
quoting設定値 | 内容 |
---|---|
csv.QUOTE_ALL | 全てのフィールドをクォート |
csv.QUOTE_MINIMAL | 任意の特別文字を含むフィールドをクォート(デフォルト) |
csv.QUOTE_NONNUMERIC | 全ての非数値フィールドをクオート |
csv.QUOTE_NONE | クォートしない |
基本的な使い方はreader関数とほぼ同じです。
第1引数にopen関数で取得したファイルインスタンスを渡し、あとは必要に応じてキーワード引数を設定します。
これらのキーワード引数もreaderに用意されていたものとほぼ同じです。
データを追加する
データの書き出しはwriterインスタンスの「writerow」メソッドを使います。
引数には保存するデータをリストにまとめて指定します。
これでリストの要素が CSVフォーマットのカンマ区切り1行に変換されて書き出されます。
ではCSVファイルへの書き出しを行ってみましょう。
テキストファイルにある名前をCSVに変換してCSVファイルに追記するという処理を実行してみます。
テキストファイルは以下のようなフォーマットです。
田中 正樹
堀 圭一
佐藤 蛾二郎
由井 結衣
太田 太陽
皆真美 進
大田原 小太郎
水沼 涼太
斉藤 真希
青田 洋子
鈴木 唯
河合 知恵
では、このテキストを読み込んで姓と名をカンマ区切りで分けて CSVファイルに出力してみましょう。
import csv
lis = []
with open("sample.txt",encoding="utf-8") as file:
for line in file:
lis.append(line.split())
with open("name.csv","w",encoding="utf-8") as file:
filewriter = csv.writer(file,quoting=csv.QUOTE_NONNUMERIC)
for row in lis:
filewriter.writerow(row)
5行目でテキストファイルを読み込んで1行毎に空白でテキスト分割し、姓と名に分けてリストに格納します。
それから、9行目でCSVファイルを作成し、全要素にクオートを付けた状態でCSVファイルに書き込みます。
実行後に「name.csv」ファイルが作成されており、姓と名がカンマ区切りで表示されていることを確認します。
"田中","正樹"
"堀","圭一"
"佐藤","蛾二郎"
"由井","結衣"
"太田","太陽"
"皆真美","進"
"大田原","小太郎"
"水沼","涼太"
"斉藤","真希"
"青田","洋子"
"鈴木","唯"
"河合","知恵"
まとめ
今回は、Pythonでの標準ライブラリであるCSVファイル操作(csvモジュール)の利用方法について学びました。