본문 바로가기
PC/Programming

[Python] MD5 hash 값 출력 프로그램

by dragom 2020. 11. 24.
반응형

main copy.exe
9.22MB

Tkinter를 이용하여 GUI 창에서 폴더를 선택하면,

해당 폴더 내의 모든 파일과 하위폴더 내 모든 파일에 대해 MD5 값을 구하고

이를 CSV로 저장할 수 있도록 하는 프로그램입니다.

 


import sys,os
import hashlib
import tkinter
from tkinter import *
from tkinter import filedialog
from tkinter import messagebox
import csv
import re

def on_closing():
    if messagebox.askokcancel("종료","종료하시겠습니까?"):
        window.quit()

def save_btn():
    with open('HASH분석결과.csv','w',newline='',encoding='utf-8-sig') as f:
        wrr=csv.writer(f)
        wrr.writerow(['파일명','MD5 hash 값'])
        for kk,target in enumerate(file_list):
            wrr.writerow([target, hash_list[kk]])
        f.close()
    window.quit()

root=tkinter.Tk()
root.withdraw()
dir_path=filedialog.askdirectory(parent=root,initialdir="./",title="선택하신 폴더 내부의 모든 파일을 검사합니다.(하위폴더 포함)")
print("\n선택하신 경로: ",dir_path)
file_list = os.listdir(dir_path)
# print(file_list)
folder_list=list()
hash_list=list()
# while(True):
file_list2=list()
for target in file_list:
    if os.path.isdir(os.path.join(dir_path,target)):
        folder_list.append(target)
    else:
        file_list2.append(target)
while(True):
    folder_list2=list()
    for target in folder_list:
        file_list=os.listdir(os.path.join(dir_path,target))
        for ttarget in file_list:
            if os.path.isdir(os.path.join(dir_path,target,ttarget)):
                folder_list2.append(os.path.join(target,ttarget))
            else:
                file_list2.append(os.path.join(target,ttarget))
    folder_list=folder_list2
    if folder_list2.__len__()==0:
        break
file_list = file_list2
# print(file_list)
for target in file_list:
    try:
        with open(os.path.join(dir_path,target),'rb') as f:
            data=f.read()
            hash_list.append(hashlib.md5(data).hexdigest())
            f.close()
    except:
        hash_list.append('Error')
    print(target,'\t',hash_list[-1])

print('총 파일 수: ',file_list.__len__())
window=Tk()

label_text=''
for temp in file_list:
    label_text=label_text+"\n"+temp
label1=Label(window,text=label_text,bg='white',justify='right')

label_text=''
for temp in hash_list:
    label_text=label_text+"\n"+temp
label2=Label(window,text=label_text,bg='white',justify='left')

btn1 = Button(window,text="저장",command=save_btn)

label_head_0=Label(window,text="파일명",bg='white',justify='right',anchor='e')
label_head_1=Label(window,text="가지고 있는 파일 MD5 값",bg='white',justify='left',anchor='w')

label_head_0.grid(row=0,column=0)
label_head_1.grid(row=0,column=1)
label1.grid(padx=10,row=1,column=0)
label2.grid(padx=10,row=1,column=1)
btn1.grid(pady=10,row=2,column=0,sticky='nesw',columnspan=2)
window.title("HASH 분석")
window.configure(bg='white')
window.protocol("WM_DELETE_WINDOW",on_closing)
window.mainloop()

반응형

댓글