基于python的方法将一个excel文件中对应的信息复制到另一个乱序了的excel里面
前言
想写这个东西是因为今天接到了老师的一个任务,老师给了我两个文件夹,其中一个文件夹有考生成绩和考生名字,另一个文件夹有考生名字,不过是乱序的。我要做的就是把这些人成绩一个个对应过来写到新的excel文档里面,不过太浪费眼睛了,我比较懒,所以就想到了python的方法,估计以后还会有很多这种情况,因此记录一下,也许还用得到
参考
本文感谢以下博客的参考:
- openpyxl 如何将字典类型的数据写入Excel中
- Python3 字典
- python中如何遍历字典中的键和值
- python操作xlsx格式文件
- python pandas 如何读取Excel数据并重新按照指定格式写入Excel文件
- 使用python读写xlsx格式中的数据【pandas】
还有一篇以前自己写过的一个博客(实测windows下也一样可以使用)
linux系统下更改pip默认下载源
思考逻辑
首先我把原来的excel文件改了一下样子,就是创建了一个新的,原先的文件包含有学号,排序,姓名等等,但是因为我只需要成绩和姓名,因此我复制了成绩和姓名两列到了一个新的文档,也就是说,以下我的操作的excel都是只有两列,第一列是姓名,第二列是成绩(需要导入的那个为空,但是有部分人已经有成绩了,不过不影响)
我的思路如下:
- 将已有成绩的文件在python中打开,并读取数据,将其转换为字典
- 将空成绩文件同样在python中打开,并读取数据,没有成绩的部分我用-1来代替了,并将其转换为字典
- 将有成绩的字典的值替换没有成绩的字典的值,当然是对应的键的值
- 将新的字典生成一个excel文件
- 将新的excel文件的东西直接复制到无成绩的excel文件中就行,因为顺序对了,直接复制没什么毛病
代码讲解
需要安装的第三方模块
- openpyxl
- pandas
- numpy
代码分解说明
导入需要的模块
import openpyxl
import pandas as pd
import numpy as np
读取相应的文件
用pandas包来读取,这里对参数我个人理解如下:
sheet_name=0的意思就是返回整张表,如果要结合多个表的话好像是其他参数,不过这里我就没有仔细研究了。
header=0的意思是读取表头,第一行就是表头
usecols的意思是按照列来读取,0和1就是读取第一列和第二列
后面就是把读取到的东西转为了np的格式,方便操作
fileone = pd.read_excel("newinput.xlsx",sheet_name=0,header=0,usecols=[0,1])
filetwo = pd.read_excel("newresult.xlsx",sheet_name=0,header=0,usecols=[0,1])
raw_data = np.array(fileone)
true_data = np.array(filetwo)
读取文件内容
这里我是按照字典的形式来读取,首先是读取有成绩的那部分名单,就是pro_data,赋值这里没什么好说的。下面那个是读取没成绩的名单,没有成绩的话pandas会读取到一个nan的值,因此这里用了np的方法判断是否为nan,是的话就给一个-1的值
pro_data = {} # 有成绩的excel文件内容
for i in range(len(raw_data)):
pro_data[raw_data[i][0]] = raw_data[i][1]
res_data = {} # 无成绩的excel文件内容
for i in range(len(true_data)):
if np.isnan(true_data[i][1]):
true_data[i][1] = -1
res_data[true_data[i][0]] = true_data[i][1]
成绩录入
这部分的本质就是让字典的值赋给另一个字典,也是主要人类工作部分,就是检索,在python里面用两个嵌套的for循环就可以完成,检索到一样的key的时候(就是a==c),会赋值给value
for a,b in pro_data.items():
for c,d in res_data.items():
if a == c:
res_data[c] = b
新字典的导出
grade = openpyxl.Workbook()
gradee = grade.active
gradee.title = 'test' # excel文件的名字
n = 1
for key,value in res_data.items():
gradee['A' + str(n)] = key # 这个A就是对应的单元格的意思
gradee['B'+ str(n)] = value
n = n + 1
grade.save('test.xlsx')
完整代码,方便复制
import openpyxl
import pandas as pd
import numpy as np
fileone = pd.read_excel("newinput.xlsx",sheet_name=0,header=0,usecols=[0,1])
filetwo = pd.read_excel("newresult.xlsx",sheet_name=0,header=0,usecols=[0,1])
raw_data = np.array(fileone)
pro_data = {}
for i in range(len(raw_data)):
pro_data[raw_data[i][0]] = raw_data[i][1]
true_data = np.array(filetwo)
res_data = {}
for i in range(len(true_data)):
if np.isnan(true_data[i][1]):
true_data[i][1] = -1
res_data[true_data[i][0]] = true_data[i][1]
print(res_data)
for a,b in pro_data.items():
for c,d in res_data.items():
if a == c:
res_data[c] = b
print(res_data)
print(pro_data)
grade = openpyxl.Workbook()
gradee = grade.active
gradee.title = 'test'
n = 1
for key,value in res_data.items():
gradee['A' + str(n)] = key
gradee['B'+ str(n)] = value
n = n + 1
grade.save('test.xlsx')
总结
python就是爽
防火防盗防诈骗