就是一个提取重复值的工具,如果excel玩儿的溜,那应该完全用不到这个软件。
'♥ 使用方法:♥\n'
'❀、首先你需要输入一个文件夹,然后回车。\n'
'❀、输入你看到的文件名称前的序号,如果为多个文件,请用空格隔开多个序号。\n'
'❀、根据预览输入需要开始合并的行,以及需要查重的列。\n'
'❀、去桌面打开你新生成的文件吧,重复的数据都在里面了。\n'
import pandas as pd
import os
from datetime import datetime
# 用户序号选择待处理文件
def select_files_from_folder(folder_path):
file_list = []
# 遍历文件夹并获取所有文件名
for root, dirs, files in os.walk(folder_path):
for file in files:
file_list.append(os.path.join(root, file))
if len(file_list) == 0:
print("文件夹中没有文件。")
return []
print("文件列表如下:")
for i, file_path in enumerate(file_list):
print(f"{i + 1}. {file_path}")
file_paths = []
selection = input("请选择需要合并去重的文件(以空格分隔序号,全选请输入'0',直接回车表示选择结束):")
indices = selection.split()
if "0" in indices:
file_paths = file_list.copy() # 全选
else:
for index_str in indices:
try:
index = int(index_str.strip()) - 1
if 0 <= index < len(file_list):
file_paths.append(file_list[index])
else:
print(f"无效的序号:{index_str},忽略该序号。")
except ValueError:
print(f"无效的序号:{index_str},忽略该序号。")
if len(file_paths) == 0:
print("未选择任何文件。")
return file_paths
# 打印前6行以方便下方的操作
def print_preview(path):
df = pd.read_excel(path)
df.index = df.index + 1
print(df.iloc[:6, :6].to_string(index=True))
# 合并文件
def merge_files(file_list, header_rows):
# 创建空的 DataFrame
merged_data = pd.DataFrame()
# 遍历每个文件
for file_name in file_list:
# 读取文件中的所有 sheet
sheets = pd.read_excel(file_name, sheet_name=None)
# 遍历每个 sheet
for sheet_name, df in sheets.items():
# 跳过抬头部分
data = df.iloc[header_rows -1:]
# 添加数据来源列和对应行数列
data.insert(0, '文件名', file_name)
data.insert(1, 'Sheet名', sheet_name)
data.insert(2, '行数', range(header_rows + 1, header_rows + len(data) + 1))
# 合并到总的 DataFrame 中
merged_data = merged_data._append(data)
print(merged_data)
return merged_data
# 提取重复值
def process_data(df, col_keep, col_sort):
# 检查 df 是否为 DataFrame 类型
if not isinstance(df, pd.DataFrame):
raise ValueError('输入数据必须为DataFrame') # 输入数据必须为 DataFrame
try:
# 根据提供的索引获取列名
col_keep_name = df.columns[col_keep + 2]
col_sort_name = df.columns[col_sort + 2]
except IndexError:
raise ValueError('列号不合法') # 列号不合法
# 选择在 col_keep_name 列中具有重复值的行(保留全部重复项)
deduped = df[df.duplicated(subset=[col_keep_name], keep=False)]
# 根据 col_keep_name 和 col_sort_name 列对 deduped DataFrame 进行排序
sorted_df = deduped.sort_values(by=[col_keep_name, col_sort_name])
return sorted_df
# 将重复值写入表格并存到桌面
def save_duplicates_to_excel(sorted_df):
# 获取当前用户的桌面路径
desktop_path = os.path.join(os.path.expanduser("~"), 'Desktop')
# 构建文件名(重复数据+当前具体时间)
current_time = datetime.now().strftime("%Y%m%d%H%M%S")
file_name = f"重复数据_{current_time}.xlsx"
# 构建完整的文件路径
file_path = os.path.join(desktop_path, file_name)
# 将DataFrame保存为Excel文件
sorted_df.to_excel(file_path, index=False)
return file_path
# 写给她的话。在前面的话
print('🍬 工作虽苦,可你有我呀🍬!\n'
'\n'
'♥ 使用方法:♥\n'
'❀、首先你需要输入一个文件夹,然后回车。\n'
'❀、输入你看到的文件名称前的序号,如果为多个文件,请用空格隔开多个序号。\n'
'❀、根据预览输入需要开始合并的行,以及需要查重的列。\n'
'❀、去桌面打开你新生成的文件吧,重复的数据都在里面了。\n'
' 🍬\n'
'🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼🌼')
# 定义需要合并的文件列表
folder_path = input("🐱请输入文件夹路径:")
file_paths = select_files_from_folder(folder_path)
print("已选择以下文件进行合并去重:")
for file_path in file_paths:
print(file_path)
# 打印第一个文件的前六行进行预览
print("预览文件前6行,方便您的选择:")
print_preview(file_paths[0])
# 询问用户输入表格的标题行数
header_rows = int(input("🐱请输入从哪行开始合并:"))
col_keep = int(input("🐱请输入依据哪列进行查重并排序:"))
col_sort = col_keep
# 调用函数进行合并
merged_data = merge_files(file_paths, header_rows)
df = pd.DataFrame(merged_data)
# 提取重复值
sorted_df = process_data(df, col_keep, col_sort)
print("以下为重复数据:")
print(sorted_df)
# 将重复数据文件存储到桌面
file_path = save_duplicates_to_excel(sorted_df)
print("重复数据已保存至桌面,文件路径为:" + file_path)
input("按任意键退出")
用gpt写的一个小工具,用到自取哦,不太会打包exe文件,而且我打包的应用无法在win7环境下运行,谁能打包出来单个体积比较小的文件,可以在楼下放出来,谢谢拉。
|