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

news2024/12/27 10:54:01

首先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 = 0
                for d in reader:
                    count+=1
                    if count == 1:
                        continue
                    id_ = res.get(d[0], '-')
                    if id_ != '-':
                        id_ = id_[0]

                    d[-1] = id_
                    f1.writerow(d)

main()

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/562295.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

伦茨科技带你了解蓝牙App开发的流程

随着移动互联网的快速发展,给我们的生活带来了越来越多的便利,蓝牙App的开发也越来越普及。那么,简单来说,蓝牙App软件的开发就是在手机上为蓝牙物理设备提供具有相关功能的App软件终端,让蓝牙设备更方便的为用户提供服…

appsync unified怎么安装

一、什么是AppSync Unified? AppSync Unified是一款iOS设备上的越狱插件,它可以帮助用户安装和运行未经苹果审核的应用程序和插件。AppSync Unified可以支持iOS 11-14系统,并可以在iPhone和iPad上使用。它的功能主要是允许用户安装和运行不经…

电脑正常开机后几分钟就黑屏一直循环怎么办?

电脑正常开机后几分钟就黑屏一直循环怎么办?有用户在使用电脑的时候,正常去进行电脑的开机,但是开机之后,却发现屏幕变成了黑屏,而且重新启动电脑之后,依然是会出现这样的问题,那么这个情况怎么…

mmdetection3d框架安装与Demo模型运行--基于Ubuntu18.04+Cuda10.1

1.NVIDIA Driver和Cuda安装 在Ubuntu18.04机器上安装好NVIDIA Driver4.18和CUDA10.1,版本号分别为4.18和10.1 查看NVIDIA Driver版本号:nvidia-smi 查看CUDA版本号:nvcc -V 2.安装MiniConda,并创建和管理虚拟环境 2.1 安装Min…

八、数据仓库详细介绍(监控告警)

1. 前言 在前边的章节,我们设计完存储模型,开发了 ETL 任务,并且配置好流程依赖,然后上调度系统,至此我们的数据仓库基本搭建完成,而且所有流程任务都可以自动化运转了。 随着公司上线的数据处理任务越来越…

Linux - 第17节 - 网络基础(应用层三)

1.HTTPS协议 1.1.HTTPS简介 HTTPS也是⼀个应⽤层协议,是在HTTP协议的基础上引⼊了⼀个加密层。 HTTP协议内容都是按照文本的方式明文传输的,明文传输是不安全的,所以现在主流的解决 方式是在http所在的应用层和tcp所在的传输层之间加一层SSL…

Windows操作系统的文件组织结构和计算方法

我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下Windows操作系统的文件组织结构和计算方法。 这是一块非常实用的知识,感谢大家来看这个帖子。 Windows组织结构就是文件的组织形式,其中: 1.Windows逻辑结构…

HTTPS的加密流程

HTTPS的加密流程 🔎加密🔎HTTPS的基本工作过程使用对称加密引入非对称加密黑客的反制(中间人攻击)一山更比一山高(引入证书) 🔎结尾 🔎加密 加密 对称加密非对称加密 对称加密🍭 只需要一个密钥(Key) 明文 Key 密…

【Java系列】深入解析枚举类型

序言 即便平凡的日子仿佛毫无波澜,但在某个特定的时刻,执着的努力便会显现出它的价值和意义。 希望这篇文章能让你不仅有一定的收获,而且可以愉快的学习,如果有什么建议,都可以留言和我交流 问题 思考一下这寄个问题&a…

行为型设计模式01-策略模式

✨作者:猫十二懿 ❤️‍🔥账号:CSDN 、掘金 、个人博客 、Github 🎉公众号:猫十二懿 策略模式 问题引入:实现一个商场收银软件,简单的实现就是单价和数量的乘积。 1、商场收银软件 下面就来看…

掌握RDD分区

零、本讲学习目标 学会如何指定分区数量会定义与使用自定义分区器 一、RRD分区 (一)RDD分区概念 RDD是一个大的数据集合,该集合被划分成多个子集合分布到了不同的节点上,而每一个子集合就称为分区(Partition&#…

3.5 RDD持久化机制

一、RDD持久化 1、不采用持久化操作 查看要操作的HDFS文件 以集群模式启动Spark Shell 按照图示进行操作,得RDD4和RDD5 查看RDD4内容,会从RDD1到RDD2到RDD3到RDD4跑一趟 显示RDD5内容,也会从RDD1到RDD2到RDD3到RDD5跑一趟 2、采用持久化…

python解析html数据,获取到的链接是以/或 ./ 或 ../ 开头的相对链接,不是以http开头的,需要补全

一、实现的目标 在使用爬虫获取网页html数据时,解析到的链接是/或./ 开头的相对链接,不是以http开头的链接,如:/picture/0/cca65350643c441e80d390ded3975db0.png 。此时需要完成对该链接的补全,以得到正确的链接。此外,我们需要将解析到的html数据保存到起来,将来需要展…

3.8 Spark RDD典型案例

一、利用RDD计算总分与平均分 (一)准备工作 1、启动HDFS服务 2、启动Spark服务 3、在本地创建成绩文件 4、将成绩文件上传到HDFS (二)完成任务 1、在Spark Shell里完成任务 (1)读取成绩文件&#xff…

【搭建轻量级图床】本地搭建LightPicture开源图床管理系统,并公网远程访问

文章目录 1.前言2. Lightpicture网站搭建2.1. Lightpicture下载和安装2.2. Lightpicture网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 现在的手机越来越先进,功能也越来越多,而手机…

二十三种设计模式第九篇--代理模式

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。 意图:为其他对象提供一种代理以控制对这…

示范性微电子院校“抢人”,芯片赛道黄不了!

经常看到有同学问,“国内高校微电子专业最好的是哪所高校?”“想搞数字ic设计去哪所大学好呢?” 其实国内28所示范性微电子学院都是非常不错的选择。 2015年,九所示范性微电子院校名单公布,包括了清华大学、北京大学、复旦大学…

8、Linux C/C++ 实现MySQL的图片插入以及图片的读取

本文结合了Linux C/C 实现MySQL的图片插入以及图片的读取,特别是数据库读写的具体流程 一、文件读取相关函数 fseek() 可以将文件指针移动到文件中的任意位置。其基本形式如下: int fseek(FILE *stream, long offset, int whence);其中,str…

kafka 设置用户密码和通过SpringBoot测试

叙述 当前Kafka认证方式采用动态增加用户协议。 自0.9.0.0版本开始Kafka社区添加了许多功能用于提高Kafka群集的安全性,Kafka提供SSL或者SASL两种安全策略。SSL方式主要是通过CA令牌实现,此文主要介绍SASL方式。 1)SASL验证: 验证方式Kaf…

【JavaSE】Java基础语法(六):方法详解

文章目录 1. 方法概述1.1 方法的概念 2. 方法的定义和调用2.1 方法的定义2.2 方法的调用过程 3. 带参数方法的定义和调用3.1 带参数方法定义和调用3.2 形参和实参 4. 带返回值方法的定义和调用4.1 带返回值方法定义和调用4.2 带返回值方法的练习-求两个数的最大值(应用) 5. 方法…