简单记录一次帮老师用Python处理数据的小事
一 、说在前面
事情是这样的,今天下午听着喜欢的人的歌单,实验室悠闲的坐着,老师突然叫我,我当然很高兴,能被召唤,先是做了点小事情,最主要的任务是用Python去处理数据,近期学院要举行评分,老师登录需要学工号和密码,现在教学办把老师的学工号换了,而后台数据库没有改,我要做的就是生成update
语句,根据旧学工号来找到信息,然后更新学工号。
二、具体问题
我现在有两个文件,new.xlsx
和old.csv
,(两个表内老师姓名顺序不一样)前者里面放的是老师的姓名以及新的学工号,后者放的是老师的姓名和旧的学工号,我需要做的是根据老师姓名,把新学工号和旧学工号一一对应,然后生成update
语句。
三、最终实现
然后复制了屁颠屁颠的放到txt文件发给了老师,完成任务,大概花了半个小时(想思路、写代码、验证是否对应准确,中间还和朋友聊天)。
四、操作思路
1、读取数据
需要源文件,文件路径,两种文件格式(csv
和xlsx
)读取方式不同,利用pandas
模块。
2、数据处理
利用字典存储数据,实现一一对应关系,同时也方便后面查询处理(字典是用Hash存储实现,使用开放寻址法中的二次探查来解决冲突的,查询快)
3、实现要求
得到旧员工号和新员工号一一对应关系后,就可以一一对应的填入sql语句中了,遍历字典,然后填入sql语句利用format
函数。
4、源代码
import pandas as pd
# 读取数据文件路径
rpath_csv = r"H:\temp\old.csv"
# 读取数据
csv_read = pd.read_csv(rpath_csv)
old_dict = {}
# 数据处理,创建一个字典 k : v 姓名 :旧的学工号
for k, v in csv_read.values:
old_dict[v] = k
# 数据读取路径
rpath_excel = r"H:\temp\new.xlsx"
# 打开excel文件
excel_file = pd.ExcelFile(rpath_excel)
# 读取文件内容
excel_read = {sheetName : excel_file.parse(sheetName) for sheetName in excel_file.sheet_names}
# 数据处理
list_id = list(excel_read["Sheet1"]["人员代码"])
list_name = list(excel_read["Sheet1"]["姓名"])
# 创建一个字典 k : v 姓名 :新的学工号
new_dict = {}
for i in range(len(list_id)):
new_dict[list_name[i]] = list_id[i]
# 最终字典 k : v 旧学工号 :新学工号
dict_end = {}
for k, v in old_dict.items():
# k表示名字,直接用成员运算符来判断名字在不在new_dict
# 通过共同属性名字链接新旧学工号
if k in new_dict:
dict_end[v] = new_dict[k]
for k, v in dict_end.items():
# 打印 update 语句
print("update tb_user set userid='{0}' where userid='{1}';".format(v, k))
个人思考
看着好像是个挺简单的事情,但要是人手动去一个个对名字更改,数据量大一点,根本受不了,一直复制粘贴自己也会累的,当然除了解决了问题值得高兴,最让人高兴的自己的思维,遇到问题了,从哪里开始思考,怎么去实现,最终解决问题,思维决定了你解决问题的快慢,技术决定了你到底能不能解决问题,希望大家多思考,多进步。
写这篇文章的途中,我又想到了新的方法,半分钟可以解决刚刚的问题,根据姓名列来排序,那么两个列表的老师名字顺序就相同了,对应的学工号自然是一一对应的,直接复制粘贴到一个新的文件里,然后读取即可,效果见下图。