walkの練習
フォルダ構成は下記のようになっています。
(コマンドプロンプトでtree フォルダ名 /f)
LOGS
│ log.txt
│ log2.txt
│ 大きいファイル君1.htm
│ 新規 Text Document.txt
│
├─.ipynb_checkpoints
├─202112_15
│ │ log.txt
│ │ log2.txt
│ │ 大きいファイル君2.htm
│ │
│ └─.ipynb_checkpoints
│ 大きいファイル君2-checkpoint.htm
│
└─2021_1214
│ koko.txt
│ 大きいファイル君3.htm
│
├─.ipynb_checkpoints
└─その他
│ 大きいファイル君4.htm
│
└─.ipynb_checkpoints
まずはどのように表示されるか見てみる。
import os
dir = 'logs'
for path,sub,filenames in os.walk(dir):
print(f"path: ,{path}")
print(f"sub: ,{sub}")
print(f"filenames: ,{filenames}")
実行結果
path: ,logs
sub: ,['.ipynb_checkpoints', '202112_15', '2021_1214']
filenames: ,['log.txt', 'log2.txt', '大きいファイル君1.htm', '新規 Text Document.txt']
path: ,logs\.ipynb_checkpoints
sub: ,[]
filenames: ,[]
path: ,logs\202112_15
sub: ,['.ipynb_checkpoints']
filenames: ,['log.txt', 'log2.txt', '大きいファイル君2.htm']
path: ,logs\202112_15\.ipynb_checkpoints
sub: ,[]
filenames: ,['大きいファイル君2-checkpoint.htm']
path: ,logs\2021_1214
sub: ,['.ipynb_checkpoints', 'その他']
filenames: ,['koko.txt', '大きいファイル君3.htm']
path: ,logs\2021_1214\.ipynb_checkpoints
sub: ,[]
filenames: ,[]
path: ,logs\2021_1214\その他
sub: ,['.ipynb_checkpoints']
filenames: ,['大きいファイル君4.htm']
path: ,logs\2021_1214\その他\.ipynb_checkpoints
sub: ,[]
filenames: ,[]
pathの動きをみることで、どのような歩き方をしているかが分かる。
階層ごとに歩くのではなく、1つのディレクトリに深く入れるところまで入り、
また次のディレクトリを行く動きになっている。
最初にA,B,Cというサブディレクトリがあった場合、
A → A-1 → A-2 ・・・ B → B-1 ・・・C → C-1・・・と歩くようだ。
それでは次に、特定の要件を満たすファイルをリスト化する処理を書く
要件
- 500キロバイト以上 1000キロバイト未満のファイルをタブル型でリストに追加
- 出来たリストをサイズサイズが大きい順に並べ替える
## 500kb以上1000kb未満のファイルをリストにする
## フォルダ全体のサイズ
import os
def get_largefile_list(dir):
large_file_list=[]
size = 0
for path,sub,filenames in os.walk(dir):
for file in filenames:
file_path = os.path.join(path,file)
size = os.path.getsize(file_path)
size = round(size/1024,1)
if 1000>size >= 500:
print(file_path)
large_file_list.append((file,size))
return large_file_list
large_file_list = get_largefile_list("logs")
large_file_list.sort(key=lambda s:s[1],reverse=True)
print(large_file_list)
実行結果
[('大きいファイル君4.htm', 796.9), ('大きいファイル君2.htm', 721.1), ('大きいファイル君3.htm', 721.1), ('大きいファイル君1.htm', 648.4), ('大きいファイル君2-checkpoint.htm', 648.4)]