数据匿名化工具:保护隐私,满足法规
导入所需模块
import tkinter as tk from tkinter import filedialog import pandas as pd
创建主窗口
root = tk.Tk() root.title('数据匿名系统')
定义全局变量
data = None k_value = None
定义函数:文件导入
def open_file(): global data file_path = filedialog.askopenfilename() if file_path.endswith('.csv'): data = pd.read_csv(file_path) elif file_path.endswith('.xlsx'): data = pd.read_excel(file_path) else: tk.messagebox.showerror('错误', '不支持的文件格式!') return # 显示数据表内容 display_table(data)
定义函数:显示数据表内容
def display_table(data): table_window = tk.Toplevel(root) table_window.title('数据表内容') table_frame = tk.Frame(table_window) table_frame.pack() # 创建表格 table = tk.Text(table_frame, height=20, width=80) table.pack() # 显示数据表内容 table.insert(tk.END, str(data))
定义函数:简单匿名化
def simple_anonymization(): global data # 获取需要匿名化的属性 selected_columns = [column.get() for column in columns_listbox.curselection()] if not selected_columns: tk.messagebox.showwarning('警告', '请至少选择一个属性!') return # 对属性值进行编号替换 for column in selected_columns: data[column] = data[column].astype('category').cat.codes # 显示匿名化后的数据表内容 display_table(data)
定义函数:检查K匿名
def check_k_anonymity(): global data, k_value k_value = k_entry.get() if not k_value.isdigit(): tk.messagebox.showwarning('警告', 'K值必须是一个正整数!') return k_value = int(k_value) # 遍历数据表,检查每个记录是否满足K匿名的要求 for index, row in data.iterrows(): sub_data = data.drop(index) sub_data = sub_data[(sub_data==row).all(axis=1)] if len(sub_data) < k_value: # 如果数据表不满足K匿名要求,进行泛化处理 generalization() return tk.messagebox.showinfo('提示', '数据表满足K匿名的要求!')
定义函数:泛化处理
def generalization(): global data, k_value # 获取需要进行泛化处理的属性 selected_columns = [column.get() for column in columns_listbox.curselection()] if not selected_columns: tk.messagebox.showwarning('警告', '请至少选择一个属性!') return # 根据K值,对属性值进行泛化处理 for column in selected_columns: data[column] = pd.cut(data[column], k_value, labels=range(k_value)) # 显示泛化后的数据表内容 display_table(data)
定义函数:输出结果
def export_result(): global data if not data: tk.messagebox.showwarning('警告', '数据表为空!') return # 获取用户选择的输出格式和保存路径 file_type = file_type_var.get() file_path = filedialog.asksaveasfilename(defaultextension=file_type) if file_type == 'CSV': data.to_csv(file_path, index=False) elif file_type == 'Excel': data.to_excel(file_path, index=False)
创建菜单栏
menu_bar = tk.Menu(root)
添加文件菜单
file_menu = tk.Menu(menu_bar, tearoff=0) file_menu.add_command(label='打开文件', command=open_file) file_menu.add_separator() file_menu.add_command(label='退出', command=root.quit) menu_bar.add_cascade(label='文件', menu=file_menu) root.config(menu=menu_bar)
创建主界面
main_frame = tk.Frame(root) main_frame.pack()
创建属性列表框
columns_frame = tk.Frame(main_frame) columns_frame.pack(side=tk.LEFT, padx=10) columns_label = tk.Label(columns_frame, text='属性列表:') columns_label.pack() columns_listbox = tk.Listbox(columns_frame, selectmode=tk.MULTIPLE, height=10, width=20, state=tk.DISABLED)
创建操作列表框
operations_frame = tk.Frame(main_frame) operations_frame.pack(side=tk.LEFT, padx=10) operations_label = tk.Label(operations_frame, text='操作列表:') operations_label.pack() simple_anonymization_button = tk.Button(operations_frame, text='简单匿名化', command=simple_anonymization) simple_anonymization_button.pack(pady=5) k_label = tk.Label(operations_frame, text='输入K值:') k_label.pack() k_entry = tk.Entry(operations_frame, width=10) k_entry.pack() check_k_anonymity_button = tk.Button(operations_frame, text='检查K匿名', command=check_k_anonymity) check_k_anonymity_button.pack(pady=5) generalization_button = tk.Button(operations_frame, text='泛化处理', command=generalization) generalization_button.pack(pady=5) file_type_var = tk.StringVar(value='CSV') file_type_label = tk.Label(operations_frame, text='文件类型:') file_type_label.pack() file_type_radiobutton_csv = tk.Radiobutton(operations_frame, text='CSV', variable=file_type_var, value='CSV') file_type_radiobutton_csv.pack() file_type_radiobutton_excel = tk.Radiobutton(operations_frame, text='Excel', variable=file_type_var, value='Excel') file_type_radiobutton_excel.pack() export_button = tk.Button(operations_frame, text='输出结果', command=export_result) export_button.pack(pady=5)
打开文件后,启用属性列表框,并将其填充属性
def open_file(): global data file_path = filedialog.askopenfilename() if file_path.endswith('.csv'): data = pd.read_csv(file_path) elif file_path.endswith('.xlsx'): data = pd.read_excel(file_path) else: tk.messagebox.showerror('错误', '不支持的文件格式!') return # 填充属性列表框 for column in data.columns: columns_listbox.insert(tk.END, column) columns_listbox.config(state=tk.NORMAL) # 显示数据表内容 display_table(data)
root.mainloop()
原文地址: https://www.cveoy.top/t/topic/ooA6 著作权归作者所有。请勿转载和采集!