1import pandas as pd
2import os
3#path = os.getcwd()4org = path = os.getcwd()5print("working directory is", path)6# ディレクトリ階層+中身 が各列に入る2次元リストを作る7# [['AAA'],8# ['AAA', 'test1.xlsx'],9# ['AAA', 'BBB'],10# ['AAA', 'BBB', 'test2.xlsx'],11# ...]12pathlist =[]1314for curDir, dirs, files in os.walk(path):15#leaf = curDir.split('/')16#pathlist.append(leaf)17#dum = 0 if curDir == org else len(curDir[len(org)+1:].split('\'))18 dum = curDir.count('\') - org.count('\')# コードを改善19for a_dir in dirs:20#pathlist.append(leaf + [a_dir])21 pathlist.append([curDir]+['']* dum +[a_dir])22for a_file in files:23#pathlist.append(leaf + [a_file])24 pathlist.append([curDir]+['']* dum +[a_file])25print(pathlist)26mx =max(len(s)for s in pathlist)27pathlist =[s +['']*(mx -len(s))for s in pathlist]28# 作った2次元リストをデータフレームにする29path_df = pd.DataFrame(pathlist)30print(path_df)
行出力を深さ優先にしたコード
Python
1import pandas as pd
2import os
34defmake_pathlist(path):5 pathlist =[]6for curDir, dirs, files in os.walk(path):7 dum = curDir.count('\') - org.count('\')8for a_dir in dirs:9 pathlist.append([curDir]+['']* dum +[a_dir])10for a_file in files:11 pathlist.append([curDir]+['']* dum +[a_file])12 mx =max(len(s)for s in pathlist)13return[s +['']*(mx -len(s))for s in pathlist]1415defconv_to_depthfirst(pathlist):16for i inrange(len(pathlist)):17for j inrange(1,len(pathlist[i])):18dir= os.path.join(pathlist[i][0], pathlist[i][j])19if pathlist[i][j]and os.path.isdir(dir):20 zs = ze =021for k inrange(i+1,len(pathlist)):22if pathlist[k][0].find(dir)>=0:23if zs ==0:24 zs = ze = k
25else:26 ze = k
27else:28if zs >0:29break30if zs > i +1:31# zs ~ ze を i と i + 1 の間に挿入する32return conv_to_depthfirst(pathlist[0:i+1]+ pathlist[zs:ze+1]+ pathlist[i+1:zs]+ pathlist[ze+1:])33return pathlist
3435org = path = os.getcwd()36print("working directory is", path)37# ディレクトリ階層+中身 が各列に入る2次元リストを作る38pathlist = make_pathlist(path)39pathlist = conv_to_depthfirst(pathlist)# 深さ優先順に変換4041# 作った2次元リストをデータフレームにする42path_df = pd.DataFrame(pathlist)43print(path_df)
lehshellさん
先日はご回答ありがとうございました。今週頂いたコードを読み解く作業をしていたのですが、初心者の私には複雑すぎてよくわからない状況です。私なりに調べてコードの各行にコメントで何をしているかを書き出してみましたが分からない行は、疑問文でコメントを書いています。
import pandas as pd
import os
def make_pathlist(path): #pathlistを作成する
pathlist = [] #[]をpathlistに代入する
for curDir, dirs, files in os.walk(path): #指定したディレクトリからトップダウンの流れでディレクトリを走査
dum = curDir.count('\') - org.count('\') #ここでは何を変数に代入しているのか??
for a_dir in dirs: #各ディレクトリの一覧を取得
pathlist.append([curDir] + [''] * dum + [a_dir]) #ここでは何をしているのか??
for a_file in files: #各ファイルの一覧を取得
pathlist.append([curDir] + [''] * dum + [a_file]) #ここでは何をしているのか??
mx = max(len(s) for s in pathlist) #ここでは何を変数に代入しているのか??
return [s + [''] * (mx - len(s)) for s in pathlist] #何の戻り値を返しているのか?
def conv_to_depthfirst(pathlist): #深さ優先順に変換
for i in range(len(pathlist)): #0からpathlistの数を超えないを範囲で繰り返し処理をする
for j in range(1, len(pathlist[i])): #ここから下の行は何をしているのか??
dir = os.path.join(pathlist[i][0], pathlist[i][j])
if pathlist[i][j] and os.path.isdir(dir):
zs = ze = 0
for k in range(i+1, len(pathlist)):
if pathlist[k][0].find(dir) >= 0:
if zs == 0:
zs = ze = k
else:
ze = k
else:
if zs > 0:
break
if zs > i + 1:
# zs ~ ze を i と i + 1 の間に挿入する
return conv_to_depthfirst(pathlist[0:i+1] + pathlist[zs:ze+1] + pathlist[i+1:zs] + pathlist[ze+1:])
return pathlist
主に、for文での処理が作業段階ごとにprintなどで出力できれば、ここでは何の作業をしているのだなと把握しやすいのですが、そのようなことってできるのでしょうか。