質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1041閲覧

フォルダサイズの取得(社内ネットワーク)

ken248

総合スコア24

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/02/09 06:32

社内ネットワーク内の各フォルダサイズを取得したいと思っています。
社内ネットワークで一部のフォルダには閲覧制限があるためそのフォルダは算出不能としたいです。

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()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2021/02/09 07:30

pathlib.globを使ってみてはいかがでしょう、取り回しが簡単です。さらに例外の理由を確認すると原因究明しやすくなるかと思います。
ppaul

2021/02/09 08:51

全部は見ていませんが、def get_size のところで、exceptが起きたときに値を返していないのはバグではないでしょうか。 また、total += get_size(entry.path)で引数が1個なのもバグではないでしょうか。
ken248

2021/02/09 08:54

t_obataさん フォルダの取得のところで使うということですよね?
ken248

2021/02/09 09:00

ppaulさん 後半のご意見は色々試している中で生じていました。 調べてもなかなかわからなかったのですが、 total += get_size(entry.path)  ここの引数は4個必要ということですかね? 申し訳ございませんが、プログラミングの知識不足でして… ①引数4個は何を入れるべきなのでしょうか?(wb1,ws1,sheetに対応するものがわからないです。) もしくは ②defのところの引数を減らす必要があるのでしょうか?
ken248

2021/02/09 09:00

お二方とも返信ありがとうございます。 大変ありがたいです
t_obara

2021/02/09 23:33

ファイルサイズも取得できます
guest

回答1

0

自己解決

pandasに出力して、各ファイルの足し算を行い
合計値をフォルダサイズにしました。

投稿2021/03/25 00:14

ken248

総合スコア24

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問