techno_memo

個人用の技術メモ。python・ROS・AI系のソフトウェア・ツールなどの情報を記載

pandasのデータファイル読み込み方法 (フォルダ配下のファイルを一括読み込み)

やりたいこと

 Pandasでユーザーが指定したローカルフォルダにある下記データファイルを読み込む

  • csvファイル

  • tsvファイル

  • xls/xlsxファイル

  • jsonファイル

 フォルダ・ファイルパスを指定すると拡張子からフォーマットを識別して取得

f:id:sd08419ttic:20190219221412p:plain

 各データファイルは1行目に項目ラベル、2行目以降にデータが記述されていることが前提

 読み込み結果はpandas dataframeのリスト(ファイル数分)、ファイル名のリストとして出力する

実装

実装結果

github.com

各フォーマットファイルをpandas data frame として読み込む

pandasの各種フォーマットの読み込み関数を利用する 入力パスの拡張子からそれぞれの関数を呼び分ける

#csvデータの読み込み
    def read_file_autohandle(self,input_path):
        '''
        入力ファイルから拡張子を自動判定してpandasに読み込む
        '''
        root, ext = os.path.splitext(input_path)  #拡張子の取得

        #拡張子毎に読み込みを実施
        if ext == ".csv":
            result = self.read_csv_data(input_path)
        elif ext == ".tsv":
            result = self.read_tsv_data(input_path)
        elif (ext == ".xls") or (ext == ".xlsx"):
            result = self.read_xls_data_firstseat(input_path)
        elif ext == ".json":
            result = self.read_json_data(input_path)
        return result


    def read_csv_data(self,filename):
        '''
        csvデータを読みとる
        '''
        result = pd.read_csv(filename, encoding="shift-jis")    #日本語データ(Shift-Jis)を含む場合を想定
        return result

    def read_tsv_data(self,filename):
        '''
        tsvデータを読みとる
        '''
        result = pd.read_table(filename, encoding="shift-jis")    #日本語データ(Shift-Jis)を含む場合を想定
        return result

    def read_xls_data_firstseat(self,filename):
        '''
        xlsx or xlsファイルの1枚目のシートを読みとる
        '''
        result = pd.read_excel(filename, encoding="shift-jis")    #日本語データ(Shift-Jis)を含む場合を想定
        return result

    def read_xls_data_allsheat(self,filename):
        '''
        xlsx or xlsファイルの全てのシートを読み込む
        '''
        result = pd.read_excel(filename, encoding="shift-jis", sheetname =None)    #日本語データ(Shift-Jis)を含む場合を想定
        return result

    def read_json_data(self,filename):
        '''
        jsonファイルを読み込む
        '''
        result = pd.read_json(filename, encoding="shift-jis")    #日本語データ(Shift-Jis)を含む場合を想定
        return result

フォルダ内のファイルリストを探索する

フォルダ内のファイルリストを作成し、指定した拡張子に該当するものだけを抽出する サブフォルダ含めたファイルリストの作成はos.walkを用いる

    def __init__(self, ext="ALL"):
        '''
        コンストラクタ
        (読み込み対象とする拡張子を引数extで指定可能)
        '''
        if ext !="ALL":
            self.target_ext = [ ext ]
        else:
            self.target_ext = [".csv",".tsv",".xls",".xlsx",".json"]
        return

    def get_file_path_list_in_folder(self,folder_path):
        '''
        入力フォルダパス直下にあるファイルのリストを作成する
        '''
        if folder_path[-1] != "\\":
            folder_path = folder_path + "\\"


        file_full_path_list = []
        # Search_Current_Directry
        for file in os.listdir(folder_path):
            root, ext = os.path.splitext(file)
            for indx2 in range(len(self.target_ext)):
                if ext == self.target_ext[indx2]:
                    file_fullpath = folder_path + file
                    file_full_path_list.append(file_fullpath)
        return file_full_path_list

    def get_file_path_list_in_folder_recrussive(self,folder_path):
        '''
        入力フォルダパスの配下(サブフォルダ含む)にあるファイルのリストを作成する
        '''
        if folder_path[-1] != "\\":
            folder_path = folder_path + "\\"
        file_full_path_list = []

        for folder, subfolders, files in os.walk(folder_path):
            for indx in range(len(files)):
                root, ext = os.path.splitext(files[indx])
                for indx2 in range (len(self.target_ext)):
                    if ext == self.target_ext[indx2]:
                        file_fullpath = folder+'/'+ files[indx]
                        file_full_path_list.append(file_fullpath)
        return file_full_path_list

参考サイト・書籍

pandasへのデータ読み込み yolo.love

参考書 Pythonではじめるデータラングリング ―データの入手、準備、分析、プレゼンテーション

www.amazon.co.jp