[Python基礎]PythonでCSVファイルを読み込む

Python
スポンサーリンク

はじめに

以前、PythonでCSVファイルを出力する方法をまとめました。今回は反対にCSVファイルを読み込み、Python上で処理する方法について、まとめてみました。

今回もPythonに標準で搭載されているcsvモジュールを用います。

ソースコード

今回は、e-Statによって公開されている政府統計による1920年以降の日本の人口の記録を用いて解説いたします。

以降に記載しているソースコードを試される場合は、こちらのページにある男女別人口という項目のCSVファイルを事前にダウンロードし、ソースコードと同じフォルダに入れておいてください。

ひとまず上から20行までの要素をターミナル上に出力してみます。

import csv

if __name__ == "__main__":
    with open("c01.csv", "r", newline="", encoding="shift_jis") as file:
        i = 0
        reader = csv.reader(file, dialect="excel") #excelによるcsvに適応した設定で読み込むためにdialect="excel"と指定する
        for row in reader:
            #print(row) #配列まるごと出力
            print(", ".join(row)) #", ".join()によって配列を", "で連結して表示する方法(見やすい)
            i+=1
            if i == 20:
                break

出力結果

csvファイルを読み込む際の要点を以下にまとめてみました。

with open(“c01.csv”, “r”, newline=””, encoding=”shift_jis”) as file:

with open()とはファイルを開くための関数です。open()という関数もあるのですが、同時にclose()というファイルを閉じる関数も併せて書かないといけないため、少々厄介です。このような煩わしさを避けるためにwith openを用いています。

以下はwith openの引数の意味です。

  • 第一引数: 開きたいファイルの名前
  • 第二引数: 書き込みモード(w)か読み込みモード(r)どちらか指定する
  • 第三引数: 余計な空白行を消すために書く
  • 第四引数: エンコーディングの形式を指定

それぞれの引数についてもう少し解説します。

第一引数は開きたいファイルの名前を指定します。フォルダに同名のファイルが無くても勝手に生成してくれるので、名前は適当で大丈夫ですが拡張子は必ずcsvにします。(csv以外のファイルでもwith open出来るが、この後の処理を適宜書き換える必要がある)

第二引数はファイルを開いて書き込むのか、読み取るのかで変えます。今回は読み取りなので”r”と指定します。
余談:実は指定しなくても読み込める模様です。が、念のため書いています(笑)

第三引数のnewline=””は、書き込みの際に絶対必要(理由は書き込みの方の記事を参照)ですが、読み込みの場合はあっても無くても変わりはないです。なんとなく入れているだけです。

第四引数はエンコーディングの指定です。今回用いるCSVファイルはShift-JISを用いられていたので、shift-jisを指定しています。ソースコードを応用する際、他のCSVファイルによっては文字化けするかエラーするのでcp936やUTF-8など別のものを試してみましょう。(英語ベースのcsvはほぼ確でShift-JIS以外のどれかじゃないとうまく開けないです)

reader = csv.reader(file, dialect=”excel”)

CSVファイルを読み込むための詳細設定を含んだオブジェクトを定義しています。第二引数はその詳細設定で、excel形式の設定をまとめてくれているものです。

表示などのヒント

以降はforなどで要素を表示できます。
今回の記事では取り扱いませんでしたが、
A = [row for row in reader]
とすればAは、CSVの中身が入った二次元のリストオブジェクトになりますので非常に便利かと思います。

おまけ

先ほどのコードの出力結果を見てみますと、CSVファイルには都道府県ごとの人口も記載されていることがわかります。5年ごとの記録とはいえ、データの量としてかなり多いです。踏まえて全国の総人口の要素のみを抽出、それをターミナル上に出力するコードを書いてみました。

import csv

if __name__ == "__main__":
    with open("c01.csv", "r", newline="", encoding="shift_jis") as file:
        i = 0
        reader = csv.reader(file, dialect="excel") #excelによるcsvに適応した設定で読み込むためにdialect="excel"と指定する
        for row in reader:
            if row[0] == "00": #全国の人口のみ抽出
                print(", ".join(row))
                
            elif row[0] == "都道府県コード": #項目名の抽出
                print(", ".join(row))

出力結果

全国の行のみ抽出できました。


せっかくなので雑ですが、総人口の推移をグラフで可視化してみました。
実行する際にはNumPyとMatplotlibライブラリも必要になりますのでご注意ください。

import csv
import numpy as np
import matplotlib.pyplot as plt

if __name__ == "__main__":
    x = []
    y = []
    with open("c01.csv", newline="", encoding="shift_jis") as file:
        i = 0
        reader = csv.reader(file, dialect="excel")
        for row in reader:
            if row[0] == "00": #全国の人口のみ抽出
                x.append(int(row[4]))
                y.append(int(row[6]))
                
    np_x = np.array(x)
    np_y = np.array(y)
    plt.plot(np_x, np_y)
    plt.xlabel("year")
    plt.ylabel("population")
    plt.savefig("population.png")
    plt.show()

こうしてみると人口減少している部分は、先の大戦そして少子高齢化と時代背景がうかがえますね…。


お疲れさまでした。この記事が皆様の参考になれば幸いです!


マスルキン

当ブログ管理人のマスルキンです。

高専電気系学科に5年間在籍。卒業後は専攻科に進学し現在に至る。

生まれつき聴覚障害があり
補聴器の使用、コミュニケーションでは読唇や手話などを用いています。

当ブログでは
・プログラミング・研究関係の備忘録
・趣味(筋トレ、カメラ、プラモデル、etc...)
・自身の日常
などを自由気ままに皆様に発信いたします。

記事が皆様のお役に立てば幸いです。

マスルキンをフォローする
Python プログラミング
スポンサーリンク
マスルキンをフォローする
マスルキンの部屋

コメント

  1. […] 2020/06/24追記: CSVファイルの読み込みに関する記事もまとめてみましたのでそちらも是非ご覧ください! […]

タイトルとURLをコピーしました