简单记录一次帮老师用Python处理数据的小事

一 、说在前面

事情是这样的,今天下午听着喜欢的人的歌单,实验室悠闲的坐着,老师突然叫我,我当然很高兴,能被召唤,先是做了点小事情,最主要的任务是用Python去处理数据,近期学院要举行评分,老师登录需要学工号和密码,现在教学办把老师的学工号换了,而后台数据库没有改,我要做的就是生成update语句,根据旧学工号来找到信息,然后更新学工号。

二、具体问题

我现在有两个文件,new.xlsxold.csv,(两个表内老师姓名顺序不一样)前者里面放的是老师的姓名以及新的学工号,后者放的是老师的姓名和旧的学工号,我需要做的是根据老师姓名,把新学工号和旧学工号一一对应,然后生成update语句。

关于csv文件和xlsx文件读取可以看我的数据分析学习专栏文章
基础篇(一)
基础篇(二)

简单记录一次帮老师用Python处理数据的小事
简单记录一次帮老师用Python处理数据的小事
简单记录一次帮老师用Python处理数据的小事

三、最终实现

简单记录一次帮老师用Python处理数据的小事
然后复制了屁颠屁颠的放到txt文件发给了老师,完成任务,大概花了半个小时(想思路、写代码、验证是否对应准确,中间还和朋友聊天)。

四、操作思路

1、读取数据

需要源文件,文件路径,两种文件格式(csvxlsx)读取方式不同,利用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))

个人思考

看着好像是个挺简单的事情,但要是人手动去一个个对名字更改,数据量大一点,根本受不了,一直复制粘贴自己也会累的,当然除了解决了问题值得高兴,最让人高兴的自己的思维,遇到问题了,从哪里开始思考,怎么去实现,最终解决问题,思维决定了你解决问题的快慢,技术决定了你到底能不能解决问题,希望大家多思考,多进步。
写这篇文章的途中,我又想到了新的方法,半分钟可以解决刚刚的问题,根据姓名列来排序,那么两个列表的老师名字顺序就相同了,对应的学工号自然是一一对应的,直接复制粘贴到一个新的文件里,然后读取即可,效果见下图。
简单记录一次帮老师用Python处理数据的小事