当前位置: 首页 > news >正文

Python对Excel文件多表对多表之间的匹配(两种不同表头)——之json版

首先Excel文件多表对多表之间的匹配(VLOOKUP),有多种办法,

1:将Excel文件导入Mysql或其他数据库,然后将两种表合并成一张表,接着用数据库匹配

2:将两种表内容,复制粘贴到一起,各自分别保存成一张表,然后VLOOUP,这是最普通的做法

3:将想要匹配的多张表的匹配项做成json文件,然后合并多个json文件,接着用想要匹配的表依次去匹配合并后的json,这样有个好处,就是速度快,而且是每个单独分开的

我今天分享的是第三种方法,下面我用小例子,来说明一下我的需求:

首先我有三张虚拟表,表头如下,其中字段:【证件号】,是空的,它的值是通过姓名(假设姓名是为一项),去另外3张表里去匹配,当然可能匹配不到

下面是原始表(我工作中遇到的是30张表!!!)

在这里插入图片描述

下面三张是想要匹配的表(我工作中遇到的实际情况是30多张表,每张表90多万行🤣)

在这里插入图片描述

所以到这里,我的需求已经显而易见了,这里的表数据量都是比较少的,实际情况上面也讲了,数据量非常庞大,那么如何解决呢,我分成了4步

第 1 步

先将所有数据转换成csv格式

在这里插入图片描述

代码

import os
import time
import pandas as pd  # 导入pands库
def xlsx2csv():# 读取xlsx数据t1 = time.time()for f in os.listdir("原始表/"):data = pd.read_excel("原始表/" + f, index_col=0)  # 设置index_col=0,写入文件时第一列不会存在序列号data.to_csv("csv版" + f + '.csv', encoding='utf-8')  # 将数据写入csv文件print("写入完成......")t2 = time.time()print(t2 - t1)
xlsx2csv()

第2 步

将匹配项转为json文件

下面这行代码是准备做字典,元组中的第一个参数是键,第二参数是值(可以拼接写法,如d[1]+d[2],或这用符号隔开方便切割,如d[1]+‘-’+d[2])

list_a.append((d[0], d[0])) 1

其实我这个代码是可以包含重复的键的,如若包含重复的键,它会把多个值放在列表里

具体的大家可以查看这篇文章:python一键多值

下面视频中我的值的索引写错了,大家忽略,后来我改了,但是视频已经录好了看🤣

请添加图片描述

代码

import csv
import os
from collections import defaultdict
def write_json():for f in os.listdir("./csv版/"):with open("./csv版/" + f, newline='', encoding='utf-8') as csvfile:# 读取 CSV 文件内容reader = csv.reader(csvfile, delimiter=',', quotechar='"')# 遍历 CSV 文件中的每一行数据print(f, "加载完毕")list_a = []  # 列表用来存放 (A列,B列) 的元组,所有的数据for d in reader:# 处理每一行数据# print(d)list_a.append((d[0], d[0]))  # 这个就不翻译了吧,添加数据d = defaultdict(list)  # 创建字典for key, value in list_a:d[key].append(value)  # 省去了if判断语句,添加字典with open(f"./json文件/{f.split('.')[0]}.json", "w", encoding="utf-8") as f2:f2.write(json.dumps(d, ensure_ascii=False))  # 写入json,防止乱码write_json()

第 3步

合并上一步的json文件。

在这里插入图片描述

代码

import json
import os
def merge_json():# 定义要合并的json文件路径# 定义合并后的json文件路径# 定义一个空的字典,用于存储合并后的json数据merged_data = {}# 遍历所有的json文件,将数据合并到merged_data中for file in os.listdir("./json文件/", ):with open("./json文件/" + file, 'r', encoding="utf-8") as f:data = json.load(f)merged_data.update(data)print(file)# 将合并后的json数据写入到merged_file中with open("合并json/mergr.json", 'w', encoding="utf-8") as f:json.dump(merged_data, f, ensure_ascii=False)  # 防止中文乱码print("合并成功!")merge_json()

第 4 步,最后一步啦!!

1、 把第一步的转换成功的csv文件,放入文件夹【数据源】准备读取

2、加载刚刚合并后的json文件

3、开始匹配

4、保存

请添加图片描述

在这里插入图片描述

奉上完整版代码

'''作者:一晌小贪欢
手机:xxxx
'''# xlsx文件转csv文件
import csv
import json
import os
import time
from collections import defaultdict
import pandas as pd  # 导入pands库def xlsx2csv():# 读取xlsx数据t1 = time.time()for f in os.listdir("原始表/"):data = pd.read_excel("原始表/" + f, index_col=0)  # 设置index_col=0,写入文件时第一列不会存在序列号data.to_csv("csv版" + f + '.csv', encoding='utf-8')  # 将数据写入csv文件print("写入完成......")t2 = time.time()print(t2 - t1)
xlsx2csv()def write_json():for f in os.listdir("./csv版/"):with open("./csv版/" + f, newline='', encoding='utf-8') as csvfile:# 读取 CSV 文件内容reader = csv.reader(csvfile, delimiter=',', quotechar='"')# 遍历 CSV 文件中的每一行数据print(f, "加载完毕")list_a = []  # 列表用来存放 (A列,B列) 的元组,所有的数据for d in reader:# 处理每一行数据# print(d)list_a.append((d[0], d[1]))  # 这个就不翻译了吧,添加数据d = defaultdict(list)  # 创建字典for key, value in list_a:d[key].append(value)  # 省去了if判断语句,添加字典with open(f"./json文件/{f.split('.')[0]}.json", "w", encoding="utf-8") as f2:f2.write(json.dumps(d, ensure_ascii=False))  # 写入json,防止乱码write_json()def merge_json():# 定义要合并的json文件路径# 定义合并后的json文件路径# 定义一个空的字典,用于存储合并后的json数据merged_data = {}# 遍历所有的json文件,将数据合并到merged_data中for file in os.listdir("./json文件/", ):with open("./json文件/" + file, 'r', encoding="utf-8") as f:data = json.load(f)merged_data.update(data)print(file)# 将合并后的json数据写入到merged_file中with open("合并json/mergr.json", 'w', encoding="utf-8") as f:json.dump(merged_data, f, ensure_ascii=False)  # 防止中文乱码print("合并成功!")merge_json()def main():t1 = time.time()with open("合并json/mergr.json", "r", encoding="utf-8") as f:res = json.load(f)t2 = time.time()print(t2 - t1)for f_n in os.listdir("./数据源/"):with open("./结果/" + f_n, "w", newline='', encoding="utf-8") as f1:f1 = csv.writer(f1)f1.writerow(['姓名','地址','电话','电子邮件','出生日期','公司','职位','信用卡号码','IBAN','IP地址','证件号'])with open("./数据源/" + f_n, newline='', encoding='utf-8') as csvfile:# 读取 CSV 文件内容reader = csv.reader(csvfile, delimiter=',', quotechar='"')# 遍历 CSV 文件中的每一行数据print(f_n, "加载完毕")count = 0for d in reader:count+=1if count == 1:continueid_ = res.get(d[0], '-')if id_ != '-':id_ = id_[0]d[-1] = id_f1.writerow(d)main()

这个就是今天分享的小工具,希望对整天面对账单、报表的财务们有所帮助!!

致力于办公自动化的小小程序员一枚#

都看到这了,关注+点赞+收藏=不迷路!!

如果你想知道更多关于Python办公自动化的知识各位大佬给个关注吧!

http://www.lryc.cn/news/70228.html

相关文章:

  • shiro环境搭建
  • 一文读懂selenium自动化测试(基于Python)
  • 如何高效地在网上找开源项目
  • 2023系统分析师---冲刺资料必备知识点三
  • 集成Bean Validation 1.1(JSR-349)到 SpringMVC
  • 【软考中级】软件设计师选择题题集(一)
  • 10个炫酷特效的网页写法(附源码),拿去就能用,奈斯奈斯
  • vscode开发stm32的编译环境配置教程
  • Live800在线客服系统:客户体验即是业绩来源
  • SAP工具箱 MR22自定义BAPI
  • ASP.NET 网上选课系统的设计与实现(源代码+论文)
  • SpringMVC学习总结(路由映射、参数传递、转发和重定向...)
  • 基于MAC地址的ACL配置
  • 软件设计师 计算机网络
  • Gradle ——Gradle安装与配置
  • 网络安全这条路到底该怎么走?
  • 【C++】位图(海量数据处理)
  • 外包干了五年,废了...
  • 请问你如何理解以下的歌词“unravel - TK from 凛冽时雨 (TK from 凛として時雨)为什么很多人说崖山海战以后无中国
  • 从8连挂到面面offer,我只用了一个月,面试25K测试岗血泪经验分享给你
  • 计算机操作系统(慕课版)第二章课后题答案
  • 【离散数学】置换群和伯恩赛德定理编程题
  • 【自然语言处理】 - 作业2: seq2seq模型机器翻译
  • 随身WIFI折腾日记(四)---拓展USB接口读取U盘内容
  • 【C++初阶】类与对象(中)之取地址及const取地址操作符重载(了解即可)
  • 代驾公司如何管理司机
  • 面了一个5年经验的测试工程师,自动化都不会也敢喊了16k,我也是醉了····
  • ChatGPT:你真的了解网络安全吗?浅谈攻击防御进行时之网络安全新定义
  • LeetCode_DFS_困难_1377.T 秒后青蛙的位置
  • 第四十九天学习记录:C语言进阶:结构体