Python

【Python】標準ライブラリの活用(CSVファイル操作:csv)

標準ライブラリの活用(CSVファイル操作:csv) Python

前回の記事で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つの関数です。

関数役割
readerCSVフォーマットのデータを読み込むためのインスタンスを作成する
writerCSVフォーマットのデータを書き出すためのインスタンスを作成する

これらの関数を使ってインスタンスを作成し、そのインスタンスのメソッドを呼び出してCSVデータを操作します。

ただ注意が必要なのが、CSVファイルのアクセス自体はopen関数を使用します。

  • CSVファイルにアクセスする→open関数を使う
  • アクセスしたCSVファイルを操作する→csvモジュールを使う

この点は理解しておきましょう。

あくまでCSVファイルを読み込んだりCSVファイルとして書き込むのはopen関数を使います、open関数を経由してCSVファイルを操作する仕組みとしてcsvモジュールがあるイメージです

ちょっと分かりにくいですが、具体的な例はプログラムを作って説明します。

CSVファイルのアクセスにはopen関数を使う、open関数でアクセスしたCSVファイルの読み書きをcsvモジュールを使って行う

スポンサーリンク

readerでCSVファイルを読み込む

では、実際にCSVファイルを読み込んでみましょう

読み込む際には以下のような手順を踏みます。

  1. open関数を使いCSVファイルを開く
  2. reader関数を使いreaderインスタンスを作成する
  3. readerインスタンスをfor文で処理する

open関数でファイルを開く手順としては、以前説明したテキストファイルと同じです。

それからcsvモジュールで用意されているreader関数を使い、CSVデータを処理するreaderインスタンスを作成します。

このインスタンスを使ってfor文を回しCSVのデータを順番に取り出していきます。

ではreader関数を見ていきましょう。

変数 = reader(ファイル
                        delimiter = “,”,

                        doublequote = True,
            
            escapechar = None,

                        lineterminator = “\r\n”,
                        quoterchar = ‘ ” ‘,
                        skipinitialspace = False)

各キーワード引数の説明は以下です。

キーワード引数説明デフォルト値
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. データは1行ずつまとめられている。
  2. 各行のデータは項目がリストにまとまって取り出される。
  3. 各項目の値は全て文字列データとして扱われる。
スポンサーリンク

CSVファイルの保存

では、今度はCSVファイル保存してみましょう。

これには以下のような手順を踏みます。

  1. open関数を使いCSVファイルを開く
  2. writer関数を使いwriterインスタンスを作成する
  3. writerインスタンスのメソッドを使いデータを書き出す

基本的な流れはCSVファイルの読み込みと同じです

まずopen関数でファイルを開きます。

それからcsvモジュールで用意されているwriter関数を使い、CSVデータを処理するwriterインスタンスを作成します。

このインスタンスのメソッドを使いCSVデータをファイルに追記していきます。

ではwriter関数を見ていきましょう。

変数 = writer(ファイル
                        delimiter = “,”,

                        doublequote = True,
            
            escapechar = None,

                        lineterminator = “\r\n”,
                        quoterchar = ‘ ” ‘,
                        skipinitialspace = False
                        quoting = csv.QUOTE_MINIMAL

各キーワード引数の説明は以下です。

キーワード引数説明デフォルト値
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行に変換されて書き出されます

writeインスタンス.writerow(リスト)

CSVデータの書き込みはwriterowを使う。追加するデータをリストにしたものを引数に渡して実行する。

では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モジュール)の利用方法について学びました。