Python入門~Pandasによる複数CSV読み取り~【初心者向け】

この記事では、python初心者向けにデータ分析や解析ではかかすことのできないpythonによるデータ読み込み方法を紹介しています。python初心者のバランが、実務に生かしている実例に基づいて記載してますので、すぐに実務に活かせます。

今回は、パスの説明と”pathlib”ライブラリを使用した複数CSVファイルの読み込み方法を記載していきます。

pandasによるCSV読み取り方法の基礎が不明な方は、前回の記事も合わせてお読みください。

0. 使用環境

  • OS: Windows10 Pro
  • Visual Studio Code: Version 1.47.0
  • Python: Version 3.7.6 (64bit)

1. データ解析の全体図

本記事のデータサイエンスの紹介範囲を示します。

データサイエンスは主に5つのステージがあります。(図のようにステージを飛ばす場合もあります。図は一例です。)

  1. データ収集(データを集めて処理できる準備をする)
  2. データの前処理(データを格納もしくはデータを解析しやすいようにデータ配列を適切にする)
  3. データ格納(データを格納しておく)
  4. データ解析(実際のデータを用いてデータ分析・解析する)
  5. データ可視化(解析結果の意味がわかりやすいように可視化する)

本記事では、Pandasを用いた1. データ収集と2.データ前処理の範囲をカバーしています。今回はその中でも一番最初に行う”pandas”を用いたフォルダ内にある複数のCSVファイルの読み込み方法を紹介します。

それでは、やっていきましょう。

2. パスとは(絶対パス、相対パス)

まずパス(path)の概念 を見てみましょう。パスとは、システムの中に存在するファイル、ディレクトリーをプログラム内から指定する方法で、 ファイル、ディレクトリーの場所を示す文字列をさします。

パスの書き方には 絶対パス と 相対パス があります。

絶対パス(absolute path)

絶対パスは、ファイルやディレクトリを一意に示すパス。Macを含むUnix系OSでは/から始まり、Windowsではドライブ文字や\\(サーバーの場合)から始まる。

Unix(Mac含む): /Users/xxx/Documents/

Windows: C:\Program Files or \\servername\

Python, pathlibで絶対パスと相対パスを相互変換・判定

相対パス(relative path)

相対パスは、あるディレクトリ(カレントディレクトリ)からの相対的なファイルやディレクトリの位置を示すパス。カレントディレクトリによって同じファイルやディレクトリでも異なるパスで表される。

例えば、/Users/xxx/Documents/file.txtというファイルの相対パスは、

/Users/をカレントディレクトリとした場合

xxx/Documents/file.txt

/Users/xxx/をカレントディレクトリとした場合

Documents/file.txt

Python, pathlibで絶対パスと相対パスを相互変換・判定

絶対パスと相対パスの違いを理解しておくと、実際のファイル読み込み時のエラーなどに対処できるので、覚えておきましょう。

この記事では、基本的には相対パスを使用していきます。

3. 実務で使えるCSV読み込み方法

パスの意味を理解したところで、CSVファイルの読み込みコードを記載していきましょう。

本記事では、”pathlib”ライブラリを使用していきます。このライブラリは、pythonのバージョンがVer 3.4以降であれば使用可能です。

バージョン3.4未満を使用の方は、”glob.glob”関数で検索してもらえれば、CSV読み込みに関しては同様の動作が可能です。

glob.globに関して: Pythonでフォルダ内のファイルリストを取得する

それでは、本記事で使用するCSVが格納されているフォルダ構成例の全体図を見ていきましょう。

カレントディレクトリに”csv_file”フォルダを用意し、その直下に2つのCSVファイル(example_001.csv, example_002.csv)があります。さらに、”folder”があり、その直下に1つCSVファイル(example_003.csv)があります。

各CSVファイルの中身は以下です。

example_001.csv
1,11,21,31,41
2,12,22,32,42
3,13,23,33,43
4,14,24,34,44
5,15,25,35,45

example_002.csv
6,16,26,36,46
7,17,27,37,47
8,18,28,38,48
9,19,29,39,49
10,20,30,40,50

example_003.csv
101,111,121,131,141
102,112,122,132,142
103,113,123,133,143
104,114,124,134,144
105,115,125,135,145

それでは”csv_file”フォルダの中にあるこれらのCSVファイルを一括で読み込むコードを書いていきます。まずは、完成形のソースコードを示します。

""" ライブラリのインポート """
import pandas as pd
from pathlib import Path 

""" CSVファイルのパス(カレントディレクトリ) """
p = Path('./csv_file')

""" 取得するファイル種類(csv) """
file_name = '*.csv'

""" 読み込むcsvファイルパスを"csv_files"に格納 """
csv_files = p.glob(file_name) 

""" カラム(列)名 """
column_name = ('A', 'B', 'C', 'D', 'E')

def main():    
    """ メインの処理 """
    """ 一括でディレクトリ(フォルダ)内のcsvファイルを一括で読込 """
    for file in csv_files:
        df1 = pd.read_csv(file, names=column_name)
        print(file)
        print(df1)

if __name__ == '__main__':
    main()

“pathlib”ライブラリにある”Path”ツールを使用します。

""" ライブラリのインポート """
import pandas as pd
from pathlib import Path 

次に、CSVファイルが保存されているフォルダを指定します。”Path(フォルダパス)”で指定して”p”に代入しています。

""" CSVファイルのパス(カレントディレクトリ) """
p = Path('./csv_file')

読み込むファイルの種類を指定します。今回はCSVファイルを読み込むので、”*.csv”の文字列を指定します。これは、ファイルの最後の文字が”.csv”で終わるファイルのみ取得するために使用します。

""" 取得するファイル種類(csv) """
file_name = '*.csv'

CSVファイル飲みを読み込む指定が完了したら、”glob”関数を用いて、フォルダ(“./csv_file)にあるCSVファイルの文字列(パス)を取得します。

まだ、CSVファイルの中のデータは取得していません。あくまで、CSVファイルのファイルパス名だけです。

""" 読み込むcsvファイルパスを"csv_files"に格納 """
csv_files = p.glob(file_name) 

ここまでで、CSVファイルパスを取得できました。あとは、取得したパスを”for”文で繰り返し読み込んで、print関数出力します。

(for文でcsv_filesにあるexample_001.csvパス名を用いて、pandas+print関数処理が終了したら、次はexample_002.csvパス名を用いて、pandas+print関数処理を行っています。)

def main():    
    """ 一括でディレクトリ(フォルダ)内のcsvファイルを一括で読込 """
    for file in csv_files:
        """ CSVファイルデータをData Frameに変換 """
        df1 = pd.read_csv(file, names=column_name)
        print(file)
        print(df1)

“02.pandas_read_csv.py”の実行結果は以下のようになります。

csv_file\example_001.csv
   A   B   C   D   E
0  1  11  21  31  41
1  2  12  22  32  42
2  3  13  23  33  43
3  4  14  24  34  44
4  5  15  25  35  45

csv_file\example_002.csv
    A   B   C   D   E
0   6  16  26  36  46
1   7  17  27  37  47
2   8  18  28  38  48
3   9  19  29  39  49
4  10  20  30  40  50

“example_001.csv”と”example_002.csv”のファイルを読み込めていることが確認できました。しかし、”example_003.csv”は読み込めていません。

これは、csvを読み込む文字列の指定に原因があります。先ほどの記述では、”file_name”を”*.csv”と指定しましたが、この記載だと”./csv_file”の直下の複数のcsvファイルパスのみを取得する記述となります。

""" CSVファイルのパス(カレントディレクトリ) """
p = Path('./csv_file')

""" 取得するファイル種類(csv) """
file_name = '*.csv'

そこで、”file_name”を以下のように変更します。

""" 再帰的にパス取得 """
file_name = '**/*.csv'

上記のように記述することで”csv_file”フォルダに有るcsvファイルをすべて読み込むことができます。”**/”の記述を追記したことで、ファイルだけでなくフォルダ名も含めて、ファイルパスを取得することが可能となります。では、完成形を見てみましょう。

""" イブラリのインポート """
import pandas as pd
from pathlib import Path 

""" CSVファイルのパス(カレントディレクトリ) """
p = Path('./csv_file')

""" 再帰的に取得するファイル種類(csv) """
file_name = '**/*.csv'

""" 読み込むcsvファイルパスを"csv_files"に格納 """
csv_files = p.glob(file_name) 

""" カラム(列)名 """
column_name = ('A', 'B', 'C', 'D', 'E')

def main():
    """ 一括でディレクトリ(フォルダ)内のcsvファイルを一括で読込 """
    for file in csv_files:
        """ CSVファイルデータをData Frameに変換 """
        df1 = pd.read_csv(file, names=column_name)
        print(file)
        print(df1)

if __name__ == '__main__':
    main()

実行結果は以下となります。”example_003.csv”も出力されました。

csv_file\example_001.csv
   A   B   C   D   E
0  1  11  21  31  41
1  2  12  22  32  42
2  3  13  23  33  43
3  4  14  24  34  44
4  5  15  25  35  45

csv_file\example_002.csv
    A   B   C   D   E
0   6  16  26  36  46
1   7  17  27  37  47
2   8  18  28  38  48
3   9  19  29  39  49
4  10  20  30  40  50

csv_file\folder\example_003.csv
     A    B    C    D    E
0  101  111  121  131  141
1  102  112  122  132  142
2  103  113  123  133  143
3  104  114  124  134  144
4  105  115  125  135  145

4. まとめ

今回の記事は、pythonの”pathlib”ライブラリによる複数csvファイルの読み込み方法をまとめました。

csvファイルを一括で読み込むことができると、データ処理がスムーズにできます。ぜひ、身につけて実務に生かしていきましょう。

次回は、必要なデータ行列を取得する方法を記事にする予定です。

それでは、良いpythonライフを!

1件のコメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT US

Baran-gizagiza
経歴:浪人→理系大学院卒業→大手製造業に就職(技術職)→アメリカ赴任中 仕事は、研究・設計など上流工程の仕事に携わっています。企業勤務を継続しながら、新しいことにチャレンジしたいと思い、ブログを下記はじめました。 このブログでは、趣味である 筋トレ(健康、ダイエット) AIとデータ(高校数学、プログラミング) 読書(主に自己啓発系) を中心に、人生経験やおすすめ情報の発信しています。