社内ネットワーク内の各フォルダサイズを取得したいと思っています。
社内ネットワークで一部のフォルダには閲覧制限があるためそのフォルダは算出不能としたいです。
def get_size(fld1,wb1,ws1,sheet):内で
基本はtryで読み込んで、閲覧制限がかかっているもののみexceptで回したいのですが、
**現状は全てexceptに行き、全てのフォルダが0で出力されています。
(エラーは出てません)
try...except...を付けずに、PC上のファイルで実行すると実行できます。
どうぞよろしくお願いいたします。
python
1import pathlib 2import os.path 3import sys 4import csv 5import glob 6import os 7import tkinter as tk 8import datetime 9import subprocess 10from tkinter import messagebox as mb 11from tkinter import filedialog 12import openpyxl 13from pandas import Series,DataFrame 14import pandas as pd 15from hurry.filesize import size, si 16 17 18def make_file(): 19 fld1 = e1.get() 20 result_file = fld1 + "/フォルダ容量0208.xlsx" 21 22 #Excelファイルの作成 23 wb1 = openpyxl.Workbook() 24 ws1 = wb1.active 25 sheet = wb1.active 26 sheet.title = 'fld_check' 27 28 pass_set(fld1,wb1,ws1,sheet) 29 30 31def pass_set(fld1,wb1,ws1,sheet): 32 #フォルダ・ファイルの入力欄が空ならアラート 33 if fld1 == '': 34 mb.showwarning('警告', 'ルートフォルダを指定してください!') 35 else: 36 get_size(fld1,wb1,ws1,sheet) 37 38 39 40**def get_size(fld1,wb1,ws1,sheet):** 41 42 total = 0 43 try: 44 for entry in os.scandir(fld1): 45 if entry.is_file(): 46 total += entry.stat().st_size 47 elif entry.is_dir(): 48 total += get_size(entry.path) 49 if total > 1000: 50 total = size(total) 51 return total 52 53 except: 54 total = "算出不能" 55 file_check(fld1,wb1,ws1,sheet,total) 56 57 58 59def file_check(fld1,wb1,ws1,sheet,total): 60 filedata = [] 61 62 for dirpath, dirname, filename in os.walk(fld1): 63 for f in dirname: 64 fd = {} 65 fd['fullname'] = os.path.join(dirpath,f) 66 67 filedata.append(fd) 68 69# パスを分解し、深さを計算する。 70 max_depth=0 71 for f in filedata: 72 splited = f['fullname'].split('\') 73 f['splited'] = splited 74 path_depth = len(splited) 75 f['depth'] = path_depth 76 77 78 if max_depth < path_depth: 79 max_depth = path_depth 80 81 82# 最も深いパスに合わせてリストを拡張する。 83 #for f in filedata: 84 # while len(f['splited']) <= max_depth: 85 # f['splited'].append('') 86 #print("0") 87 88# CSV出力用のリストを作成する。 89 outdata=[] 90 for f in filedata: 91 t = f['splited'] 92 #print(t) 93 print(total) 94 #print(t) 95 t.append(total) 96 outdata.append(t) 97 #print(outdata) 98 99 write_to_excel(fld1,wb1,ws1,sheet,total,outdata) 100 101 102def write_to_excel(fld1,wb1,ws1,sheet,total,outdata): 103 ws1.cell(row=1, column=1, value="1階層目") 104 ws1.cell(row=1, column=2, value="2階層目") 105 ws1.cell(row=1, column=3, value="3階層目") 106 ws1.cell(row=1, column=4, value="4階層目") 107 ws1.cell(row=1, column=5, value="5階層目") 108 ws1.cell(row=1, column=6, value="サイズ") 109 start_row=2 110 start_col=1 111 112 for y, row in enumerate(outdata): 113 for x, cell in enumerate(row): 114 sheet.cell(row=start_row + y, 115 column=start_col + x, 116 value=outdata[y][x]) 117 118 wb1.save('フォルダ容量0208.xlsx') 119 120 121 mb.showinfo('完了', 'ファイルの作成が完了しました。') 122 123 124#フォルダを開く処理 125def open_folder(): 126 orgin_path = e1.get() 127 if orgin_path is None: 128 folder_path = 'C:' 129 else: 130 folder_path = orgin_path 131 132 folder_path = tk.filedialog.askdirectory(initialdir = folder_path) 133 e1.insert(tk.END,folder_path) 134 135 136 137### GUI部品の設定 ### 138#windowの準備 139win = tk.Tk() 140win.minsize(250,200) 141win.title('フォルダ構成内容') 142 143#ラベルの作成 144lb1 = tk.Label(win,text='ルートパス') 145lb1.place(x=5,y=5) 146 147 148#入力boxの作成 149e1 = tk.Entry(win,width=20) 150e1.place(x=60,y=5) 151 152 153#フォルダを開くボタンの作成(上記で定義したopen_folderと紐づけ) 154btn_opn1 = tk.Button(win,text='...',command=lambda: open_folder()) 155btn_opn1.place(x=190,y=5) 156 157 158#リスト取得ボタンの作成(上記で定義したfile_write処理と紐づけ) 159btn = tk.Button(win,text='実行',command=make_file) 160btn.place(x=140,y=30) 161 162win.mainloop()
pathlib.globを使ってみてはいかがでしょう、取り回しが簡単です。さらに例外の理由を確認すると原因究明しやすくなるかと思います。
全部は見ていませんが、def get_size のところで、exceptが起きたときに値を返していないのはバグではないでしょうか。
また、total += get_size(entry.path)で引数が1個なのもバグではないでしょうか。
t_obataさん
フォルダの取得のところで使うということですよね?
ppaulさん
後半のご意見は色々試している中で生じていました。
調べてもなかなかわからなかったのですが、
total += get_size(entry.path)
ここの引数は4個必要ということですかね?
申し訳ございませんが、プログラミングの知識不足でして…
①引数4個は何を入れるべきなのでしょうか?(wb1,ws1,sheetに対応するものがわからないです。)
もしくは
②defのところの引数を減らす必要があるのでしょうか?
お二方とも返信ありがとうございます。
大変ありがたいです
ファイルサイズも取得できます
回答1件
あなたの回答
tips
プレビュー