LoginSignup
2
4

More than 5 years have passed since last update.

[Python]フォルダ構造をDataFrameに入れる方法

Last updated at Posted at 2019-04-07

はじめに

フォルダ毎や形式毎にファイルを読み込んで処理する時、それぞれのファイルpathを検索しながら取得するのは面倒ではありませんか?
そこで、ファイル情報をDataFrameに格納することで、直感的にpathを取得出来るようにしました。

サンプル

以下のようなディレクトリ構成があったとき、

tree構造
/data
└── dir_A
    └── a.txt
└── dir_B
    └── b.txt

以下のようなDataFrameを取得します。

index ファイル名 相対path ファイル形式 a b c 絶対path
0 data ./data ディレクトリ data C:/data
1 dir_A ./data/dir_A ディレクトリ data dir_A C:/data/dir_A
2 a.txt ./data/dir_A/a.txt .txt data dir_A a.txt C:/data/dir_A
3 dir_B ./data/dir_B ディレクトリ data dir_B C:/data/dir_B
4 b.txt ./data/dir_B/b.txt .txt data dir_B b.txt C:/data/dir_B

コード

tree_to_df
import pathlib
import pandas as pd
import string

def tree_to_df(path ='.', dir_only=False, file_only=False, path_only=False):

    # get target_path
    p = pathlib.Path(path)

    # get tree
    pathlist = list(p.glob("**/*"))

    # get file_info
    namelist = [i.name for i in pathlist]
    str_p = p.resolve().as_posix()
    str_pathlist = [i.resolve().as_posix() for i in pathlist]
    str_relpath = [path + '/' + i.replace(str_p + '/', '') for i in str_pathlist]
    str_pathlist_split = [i.replace(str_p + '/', '').split('/') for i in str_pathlist]
    type_list = [i.suffix if i.suffix !='' else 'dir'  for i in pathlist]

    def col_name(num):
        n = map(int, str(num))
        w = [string.ascii_lowercase[i] for i in n]
        result = ''.join(w)
        return result

    # make_df
    df_splitpath = pd.DataFrame(str_pathlist_split)
    df_splitpath = df_splitpath.rename(columns=lambda s: col_name(s))
    df_namelist = pd.DataFrame(namelist, columns= ['name'])
    df_type_list = pd.DataFrame(type_list, columns= ['type'])
    df_str_relpath = pd.DataFrame(str_relpath, columns= ['relpath'])
    df_str_abspath = pd.DataFrame(str_pathlist, columns= ['abspath'])

    # result_df
    df = pd.concat([df_namelist,df_str_relpath,df_type_list,df_splitpath,df_str_abspath],axis=1)

    # select_df
    df = df = df[df['type']=='dir'] if dir_only else df
    df = df[df['type']!='dir'] if file_only else df
    df = df['abspath'] if path_only else df

    return df

使い方

検索したいpathを関数に渡します。引数で、フォルダ・ファイル・pathのみ出力もできます。出力したDataFrameにqueryを叩くことで、直感的にpathを取得することが出来ます。

use
# cwd
tree_to_df()
# cwd
tree_to_df('.')
# up_dir
tree_to_df('../')

参考文献

Pathlibチートシート - Qiita
Pythonでフォルダ内のファイルリストを取得する - Qiita
Python, pathlibでファイル名・拡張子・親ディレクトリを取得 | note.nkmk.me
Pythonの三項演算子(条件演算子)でif文を一行で書く | note.nkmk.me
string - Alphabet range python - Stack Overflow
[python]リストの中身を文字列に変換する。 | 岡田デザインラボ

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4