From f80dcd4fff05e44ddcb096b1e9ffe13665885c17 Mon Sep 17 00:00:00 2001 From: encrypted-jpg Date: Sat, 19 Dec 2020 14:56:21 +0530 Subject: [PATCH 1/2] Added Large Info files --- large_files_cli.py | 69 +++++++++++ large_files_gui.py | 282 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 351 insertions(+) create mode 100644 large_files_cli.py create mode 100644 large_files_gui.py diff --git a/large_files_cli.py b/large_files_cli.py new file mode 100644 index 0000000..694ef65 --- /dev/null +++ b/large_files_cli.py @@ -0,0 +1,69 @@ +import os +import time +import argparse + + +class file_data: + def __init__(self): + self.name = os.getcwd() + self.size = 0.0 + self.ext = "B" + + def __lt__(self, other): + return self.size > other.size + + +def walk_dir(path): + file_lst = [] + for folderName, sub_folders, filenames in os.walk(path): + for filename in filenames: + pt = file_data() + pt.name = os.path.join(folderName, filename) + ext = os.stat(pt.name) + pt.size = ext.st_size + file_lst.append(pt) + return file_lst + + +def sort_and_normalize_and_save(initial_list, save_data): + initial_list.sort() + extensions = ["B", "KB", "MB", "GB", "TB"] + p = 0 + file = open(save_data, "w") + string = "Name,Size,Units\n" + for element in initial_list: + i = 0 + p += element.size + while element.size > 1024.0: + element.size = element.size / 1024 + i += 1 + element.size = round(element.size, 3) + element.ext = extensions[i] + string += f"{element.name},{element.size},{element.ext}\n" + file.write(string) + file.close() + print(f"Data has been saved to the file {save_data}.") + + +def main(): + my_parser = argparse.ArgumentParser(description='List the content of a folder') + + # Add the arguments + my_parser.add_argument('Path', + metavar='path', + type=str, + help='the path to list') + + args = my_parser.parse_args() + input_path = args.Path + if os.path.isdir(input_path): + lst = walk_dir(input_path) + start = time.time() + file_name = "data.csv" + sort_and_normalize_and_save(lst, file_name) + print("Time taken: ", time.time() - start, "sec") + else: + print("Invalid path specified") + + +main() diff --git a/large_files_gui.py b/large_files_gui.py new file mode 100644 index 0000000..93f2680 --- /dev/null +++ b/large_files_gui.py @@ -0,0 +1,282 @@ +import os +import pandas as pd +import time +import tkinter +import tkinter.font +import threading +from tkinter import filedialog + + +class file_data: + def __init__(self): + self.name = os.getcwd() + self.size = 0.0 + self.ext = "B" + + def __lt__(self, other): + return self.size > other.size + + +class data: + def __init__(self, path): + self.path = path + self.file_lst = [] + self.x = 0 + self.info = [] + self.thread = threading.Thread(target=self.walk_dir()) + self.thread.start() + self.complete = False + self.now = " " + + def walk_dir(self): + for folderName, sub_folders, filenames in os.walk(self.path): + for filename in filenames: + pt = file_data() + pt.name = os.path.join(folderName, filename) + ext = os.stat(pt.name) + pt.size = ext.st_size + self.file_lst.append(pt) + self.x += 1 + self.now = pt.name + self.sort_and_normalize() + + def sort_and_normalize(self): + self.file_lst.sort() + extensions = ["B", "KB", "MB", "GB", "TB"] + p = 0 + self.info = [["Name", "Size", "Units"]] + for element in self.file_lst: + i = 0 + p += element.size + while element.size > 1024.0: + element.size = element.size / 1024 + i += 1 + element.size = round(element.size, 3) + element.ext = extensions[i] + self.info.append([element.name, element.size, element.ext]) + self.complete = True + + +class App(tkinter.Tk): + def __init__(self, *args, **kwargs): + tkinter.Tk.__init__(self, *args, **kwargs) + self.title("Large Files Info") + self.path = " " + self.now = tkinter.StringVar() + self.now.set(" ") + self.total = tkinter.IntVar() + self.total.set(0) + self.info = [] + self.file_lst = [] + self.table_data = [] + self.lst = [] + self.table_index = tkinter.IntVar() + self.table_index.set(0) + self.thread = "" + self.x = tkinter.IntVar() + self.x.set(0) + self.complete = False + self.geometry("980x500") + selfWidth = self.winfo_reqwidth() + selfHeight = self.winfo_reqheight() + positionRight = int(self.winfo_screenwidth() / 2 - 2 * selfWidth) + positionDown = int(self.winfo_screenheight() / 2 - selfHeight) + self.geometry("+{}+{}".format(positionRight, positionDown)) + # self.attributes("-topmost", True) + bt1 = tkinter.Button( + self, + text="Choose the folder to Scan (Browse)".center(50, "+"), + padx=1, + pady=5, + command=self.browse_dir, + font=tkinter.font.Font(size=15), + ) + bt1.grid(column=0, row=0) + self.folder = tkinter.Label( + self, text="Folder Chosen: " + self.path, font=tkinter.font.Font(size=10) + ) + self.folder.grid(column=1, row=0) + self.file = tkinter.Label( + self, + text=str("Scanning: " + self.now.get()).center(50), + font=tkinter.font.Font(size=10), + ) + self.file.grid(column=0, row=1) + self.count = tkinter.Label( + self, + text=str( + "Scanned: " + + str(self.x.get()) + + " Total Size: " + + str(self.total.get()) + ).center(50), + font=tkinter.font.Font(size=10), + ) + self.count.grid(column=1, row=1) + self.t1 = tkinter.Label(self, text=" ", font=tkinter.font.Font(size=14)) + self.t1.grid(column=0, row=2) + self.t2 = tkinter.Label(self, text=" ", font=tkinter.font.Font(size=12)) + self.t2.grid(column=0, row=3) + self.t3 = tkinter.Label(self, text=" ", font=tkinter.font.Font(size=12)) + self.t3.grid(column=1, row=3) + for x in range(4, 14): + self.lst.append([]) + for y in range(2): + top = tkinter.Label(self, text=" ", font=tkinter.font.Font(size=10)) + top.grid(column=y, row=x) + self.lst[-1].append(top) + self.mainloop() + + def browse_dir(self): + self.t1.configure(text=" ") + self.t2.configure(text=" ") + self.t3.configure(text=" ") + for x in range(10): + self.lst[x][0].configure(text=" ") + self.lst[x][1].configure(text=" ") + self.path = " " + self.now = tkinter.StringVar() + self.now.set(" ") + self.total = tkinter.IntVar() + self.total.set(0) + self.table_data = [] + self.table_index = tkinter.IntVar() + self.table_index.set(0) + self.info = [] + self.file_lst = [] + self.thread = "" + self.x = tkinter.IntVar() + self.x.set(0) + self.complete = False + self.path = filedialog.askdirectory() + # self.update_clock() + pqr = "Folder Chosen: " + self.path + if len(pqr) >= 65: + pqr = pqr[:30] + "..." + pqr[-30:] + self.folder.configure(text=pqr) + self.thread = threading.Thread(target=self.walk_dir) + self.thread.start() + + def update_display(self): + """ + + This function updates the clock displayed on the window. + + """ + d = "Scanning: " + str(self.now.get()) + if len(d) <= 50: + d = d.center(50) + else: + d = d[:23] + "..." + d[-24:] + d.center(50) + self.file.configure(text=d) + pg = self.total.get() + i = 0 + extensions = ["B", "KB", "MB", "GB", "TB"] + while pg > 1024.0: + pg /= 1024 + i += 1 + pg = round(pg, 3) + pg = " Total Size: " + str(pg) + " " + str(extensions[i]) + self.count.configure(text=str("Scanned: " + str(self.x.get()) + pg).center(50)) + # Timer(2, function=self.update_clock).start() + + def walk_dir(self): + st = time.time() + ptr = 0 + for folderName, sub_folders, filenames in os.walk(self.path): + for filename in filenames: + pt = file_data() + pt.name = os.path.join(folderName, filename) + ext = os.stat(pt.name) + pt.size = ext.st_size + self.file_lst.append(pt) + self.now.set(pt.name) + ptr += pt.size + self.total.set(ptr) + self.x.set(self.x.get() + 1) + if time.time() - st > 1: + self.update_display() + st = time.time() + self.update_display() + self.sort_and_normalize() + + def sort_and_normalize(self): + pst = self.file_lst + pst.sort() + extensions = ["B", "KB", "MB", "GB", "TB"] + p = 0 + self.table_data.append([]) + self.info = [["Name", "Size", "Units"]] + for element in pst: + i = 0 + while element.size > 1024.0: + element.size = element.size / 1024 + i += 1 + element.size = round(element.size, 3) + element.ext = extensions[i] + self.info.append([element.name, element.size, element.ext]) + self.table_data[-1].append([element.name, element.size, element.ext]) + p += 1 + if p == 10: + p = 0 + self.table_data.append([]) + self.complete = True + self.file.configure(text="Scanning Completed") + self.display_table() + + def update_table(self, n): + if self.complete: + if n == 1: + if self.table_index.get() < len(self.table_data) - 1: + self.table_index.set(self.table_index.get() + 1) + else: + if self.table_index.get() > 0: + self.table_index.set(self.table_index.get() - 1) + for x in range(len(self.table_data[self.table_index.get()])): + pg = self.table_data[self.table_index.get()][x][0] + pg = pg[:23] + "..." + pg[-24:] + self.lst[x][0].configure(text=pg.ljust(50)) + self.lst[x][1].configure( + text=str(self.table_data[self.table_index.get()][x][1]).ljust(2, " ") + + " " + + self.table_data[self.table_index.get()][x][2].ljust(2, " ") + ) + for x in range(len(self.table_data[self.table_index.get()]), 10): + self.lst[x][0].configure(text=" ") + self.lst[x][1].configure(text=" ") + + def display_table(self): + self.t1.configure(text="Listing of Files") + self.t2.configure(text="Name of the File") + self.t3.configure(text="Size Unit") + for x in range(len(self.table_data[self.table_index.get()])): + pg = self.table_data[self.table_index.get()][x][0] + pg = pg[:23] + "..." + pg[-24:] + self.lst[x][0].configure(text=pg.ljust(50)) + self.lst[x][1].configure( + text=str(self.table_data[self.table_index.get()][x][1]).ljust(6, " ") + + " " + + self.table_data[self.table_index.get()][x][2].ljust(2, " ") + ) + bt_next = tkinter.Button( + self, + text="Next 10->".center(50, " "), + padx=1, + pady=5, + command=lambda: self.update_table(1), + font=tkinter.font.Font(size=12), + ) + bt_next.grid(column=1, row=14) + bt_prev = tkinter.Button( + self, + text="<-Previous 10".center(50, " "), + padx=1, + pady=5, + command=lambda: self.update_table(-1), + font=tkinter.font.Font(size=12), + ) + bt_prev.grid(column=0, row=14) + + +App() From ade24a80ea01ae6ba69e9cb69d62582784a6ca1d Mon Sep 17 00:00:00 2001 From: encrypted-jpg Date: Sat, 19 Dec 2020 20:38:38 +0530 Subject: [PATCH 2/2] Added Save Feature --- large_files_gui.py | 110 ++++++++++++++++++++++++++------------------- 1 file changed, 63 insertions(+), 47 deletions(-) diff --git a/large_files_gui.py b/large_files_gui.py index 93f2680..a19b578 100644 --- a/large_files_gui.py +++ b/large_files_gui.py @@ -1,4 +1,5 @@ import os +import sys import pandas as pd import time import tkinter @@ -17,44 +18,36 @@ def __lt__(self, other): return self.size > other.size -class data: - def __init__(self, path): - self.path = path - self.file_lst = [] - self.x = 0 - self.info = [] - self.thread = threading.Thread(target=self.walk_dir()) - self.thread.start() - self.complete = False - self.now = " " +class thread_with_trace(threading.Thread): + def __init__(self, *args, **keywords): + threading.Thread.__init__(self, *args, **keywords) + self.killed = False - def walk_dir(self): - for folderName, sub_folders, filenames in os.walk(self.path): - for filename in filenames: - pt = file_data() - pt.name = os.path.join(folderName, filename) - ext = os.stat(pt.name) - pt.size = ext.st_size - self.file_lst.append(pt) - self.x += 1 - self.now = pt.name - self.sort_and_normalize() + def start(self): + self.__run_backup = self.run + self.run = self.__run + threading.Thread.start(self) - def sort_and_normalize(self): - self.file_lst.sort() - extensions = ["B", "KB", "MB", "GB", "TB"] - p = 0 - self.info = [["Name", "Size", "Units"]] - for element in self.file_lst: - i = 0 - p += element.size - while element.size > 1024.0: - element.size = element.size / 1024 - i += 1 - element.size = round(element.size, 3) - element.ext = extensions[i] - self.info.append([element.name, element.size, element.ext]) - self.complete = True + def __run(self): + sys.settrace(self.globaltrace) + self.__run_backup() + self.run = self.__run_backup + + def globaltrace(self, frame, event, arg): + if event == 'call': + return self.localtrace + else: + return None + + def localtrace(self, frame, event, arg): + if self.killed: + if event == 'line': + # raise SystemExit() + pass + return self.localtrace + + def kill(self): + self.killed = True class App(tkinter.Tk): @@ -72,7 +65,7 @@ def __init__(self, *args, **kwargs): self.lst = [] self.table_index = tkinter.IntVar() self.table_index.set(0) - self.thread = "" + self.thread = thread_with_trace(target=self.walk_dir) self.x = tkinter.IntVar() self.x.set(0) self.complete = False @@ -125,15 +118,21 @@ def __init__(self, *args, **kwargs): top = tkinter.Label(self, text=" ", font=tkinter.font.Font(size=10)) top.grid(column=y, row=x) self.lst[-1].append(top) + self.save = tkinter.Label(self, text=" ", font=tkinter.font.Font(size=11)) + self.save.grid(column=1, row=17) self.mainloop() def browse_dir(self): + if self.thread.is_alive(): + self.thread.kill() + time.sleep(0.005) self.t1.configure(text=" ") self.t2.configure(text=" ") self.t3.configure(text=" ") for x in range(10): self.lst[x][0].configure(text=" ") self.lst[x][1].configure(text=" ") + self.save.configure(text=" ") self.path = " " self.now = tkinter.StringVar() self.now.set(" ") @@ -144,7 +143,6 @@ def browse_dir(self): self.table_index.set(0) self.info = [] self.file_lst = [] - self.thread = "" self.x = tkinter.IntVar() self.x.set(0) self.complete = False @@ -154,15 +152,11 @@ def browse_dir(self): if len(pqr) >= 65: pqr = pqr[:30] + "..." + pqr[-30:] self.folder.configure(text=pqr) - self.thread = threading.Thread(target=self.walk_dir) - self.thread.start() + if os.path.isdir(self.path): + self.thread = thread_with_trace(target=self.walk_dir) + self.thread.start() def update_display(self): - """ - - This function updates the clock displayed on the window. - - """ d = "Scanning: " + str(self.now.get()) if len(d) <= 50: d = d.center(50) @@ -179,7 +173,6 @@ def update_display(self): pg = round(pg, 3) pg = " Total Size: " + str(pg) + " " + str(extensions[i]) self.count.configure(text=str("Scanned: " + str(self.x.get()) + pg).center(50)) - # Timer(2, function=self.update_clock).start() def walk_dir(self): st = time.time() @@ -195,7 +188,7 @@ def walk_dir(self): ptr += pt.size self.total.set(ptr) self.x.set(self.x.get() + 1) - if time.time() - st > 1: + if time.time() - st > 0.5: self.update_display() st = time.time() self.update_display() @@ -246,6 +239,16 @@ def update_table(self, n): self.lst[x][0].configure(text=" ") self.lst[x][1].configure(text=" ") + def save_file(self, filename): + if self.complete: + df = pd.DataFrame(self.info) + df.to_excel(f"{filename}.xlsx") + self.save.configure(text=f"Data saved to {filename}.xlsx file.") + elif not self.complete: + self.save.configure(text="Data is being collected!!") + elif len(self.info) <= 1: + self.save.configure(text="N0 DATA!!!") + def display_table(self): self.t1.configure(text="Listing of Files") self.t2.configure(text="Name of the File") @@ -277,6 +280,19 @@ def display_table(self): font=tkinter.font.Font(size=12), ) bt_prev.grid(column=0, row=14) + tkinter.Label(text=" ").grid(column=0, row=15) + save_data = tkinter.Entry(self, width=30, font=tkinter.font.Font(size=13)) + save_data.insert(0, "File Name to save to {Name}.xlsx") + save_data.grid(column=0, row=16) + bt_save = tkinter.Button( + self, + text="Save File".center(50, " "), + padx=1, + pady=5, + command=lambda: self.save_file(save_data.get()), + font=tkinter.font.Font(size=12), + ) + bt_save.grid(column=1, row=16) App()