基于python的方法将一个excel文件中对应的信息复制到另一个乱序了的excel里面

前言

想写这个东西是因为今天接到了老师的一个任务,老师给了我两个文件夹,其中一个文件夹有考生成绩和考生名字,另一个文件夹有考生名字,不过是乱序的。我要做的就是把这些人成绩一个个对应过来写到新的excel文档里面,不过太浪费眼睛了,我比较懒,所以就想到了python的方法,估计以后还会有很多这种情况,因此记录一下,也许还用得到

参考

本文感谢以下博客的参考:

  1. openpyxl 如何将字典类型的数据写入Excel中
  2. Python3 字典
  3. python中如何遍历字典中的键和值
  4. python操作xlsx格式文件
  5. python pandas 如何读取Excel数据并重新按照指定格式写入Excel文件
  6. 使用python读写xlsx格式中的数据【pandas】

还有一篇以前自己写过的一个博客(实测windows下也一样可以使用)
linux系统下更改pip默认下载源

思考逻辑

首先我把原来的excel文件改了一下样子,就是创建了一个新的,原先的文件包含有学号,排序,姓名等等,但是因为我只需要成绩和姓名,因此我复制了成绩和姓名两列到了一个新的文档,也就是说,以下我的操作的excel都是只有两列,第一列是姓名,第二列是成绩(需要导入的那个为空,但是有部分人已经有成绩了,不过不影响)

我的思路如下:

  1. 将已有成绩的文件在python中打开,并读取数据,将其转换为字典
  2. 将空成绩文件同样在python中打开,并读取数据,没有成绩的部分我用-1来代替了,并将其转换为字典
  3. 将有成绩的字典的值替换没有成绩的字典的值,当然是对应的键的值
  4. 将新的字典生成一个excel文件
  5. 将新的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就是爽
防火防盗防诈骗

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值