系列文章目录

python办公自动化–数据可视化(pandas+matplotlib)–生成条形图和饼状图
python办公自动化–数据可视化(pandas+matplotlib)–生成折线图
python办公自动化–数据可视化(pandas读取excel文件,matplotlib生成可视化图表)
python办公自动化-openpyxl学习-工资表生成工资条

前言

hello各位大佬们好久不见,今天我们来更新一章使用pandas将大文件分割为小文件的教程。
很多时候我们会遇到这样的情况,我们的同事或者是对接的人给我们发来一个几百万行的csv文件
众所周知,excel现在能打开的文件的最大行数是1048576行,这个时候很多朋友就不知道该怎么做
或者有的时候虽然文件只有几万行,但是有非常多的列,我们每次一操作就会卡半天
那么这个时候我们就可以用到今天讲的东西了。
话不多说,我们现在开始吧。

一、nunpy生成用于示范的表格

再进行分割之前,我们先来学习一下如何生成用于示范的表格订单表.xlsx
这里我们用到的是numpy和pandas这两个库,首先直接上代码

import pandas as pd
import numpy as np

data={
    "ordernum":["order"+str(i).zfill(7) for i in range(1,1999998)],
    "product":np.random.choice(["A","B","C"],size=1999997,replace=True,p=[0.2,0.6,0.2]),
    "quantity":np.random.randint(5,100,size=1999997)
}
df1=pd.DataFrame(data)

前面两行就是导入这两个库
中间那一大段就是生成一个字典,也可以理解为一个虚拟的表格,表格有三列,这三列的标题
分别是“ordernum”,“product”,“quantity”,也就是“订单号”,“产品”,“数量”
最后一行就是用这个虚拟的表格的数据来生成一个表格df1

我们重点来看下中间大括号里面的三行数据
首先看一下第一行:

"ordernum":["order"+str(i).zfill(7) for i in range(1,1999998)],

这一行用来生成订单号这一列,我们先看一下生成的订单号是什么样子的
在这里插入图片描述
可以看到,每一个单元格的数据都是order加上一个七位数的编号,那么我们就很好理解了
这一行其实就是把“order”和i进行连接,i的值是从1到1999998之间的整数,注意:包括1,不包括1999998,而zfill(7)的作用,就是把每一个数扩展到长度为7,比如i如果是445,就扩展为0000445,那么这样一来,我们就的得到了从1到1999998(包含左不包含右)一共1999997个数
接下来我们看一下第二行:

"product":np.random.choice(["A","B","C"],size=1999997,replace=True,p=[0.2,0.6,0.2]),

这一行用来生成产品名称这一列,我们先来看一下产品名称这一列是什么样子的
在这里插入图片描述
我们可以看到,这一列的数据是随机从给定的“A”,“B”,“C”这三个之中取出一个,size=1999997就是说总共生成1999997行,这和上面的订单号这一列的列数是对应的,replace=True的意思是取出后放回,再取,什么意思呢,比如我们这里是从A,B,C,D,E,F,G这七个里面取三个,如果我们第一次取了C,然后如果replace=True,我们下一次就还可以取C,但是如果replace=False,我们下一次就只能从剩下的里面取数了。这里我们很明显要重复地取数,所以设置为True,最后一个P=[0.2,0.6,0.2]表示取到这三个产品的概率,我们可以从上面图片中清楚地看到B比较多,A和C比较少

最后我们看一下第三行

"quantity":np.random.randint(5,100,size=1999997)

这个就很简单了,生成从5到100之间的整数,一共生成1999997个,同样也是包括5不包括100

二、将生成的示范表格保存到本地指定的路径下

size1=len(df1)
path_create=r"E:\Python文件夹篇\订单表\生成"
if not os.path.exists(path_create):
    os.makedirs(path_create)
    print("创建了新的文件夹")
else:
    print("该文件夹已存在")
path_save=os.path.join(path_create,"订单表.csv")
print(f"{size1}行的订单表已经生成")
df1.to_csv(path_save,index=False)
print(f"{size1}行的订单表已经保存到了{path_save}这个路径下")

这一块代码就是将我们上面生成的三列1999997行的表格保存到本地
用到的to_csv这个方法,我们指定的路径是:E:\Python文件夹篇\订单表\生成
也就是说我们想把文件保存在E盘的"Python文件夹篇"这个文件夹里面的"订单表"这个文件夹里面的"生成"这个文件夹里面
中间那一块就是判断我们指定的路径是否存在,如果不存在,那么就会创建这个路径

三、将生成的用于示范的订单表分割为5个小的表格

size2=len(df1)//5
for i in range(0,5):
    start=size2*i
    end=size2*(i+1) if i<4 else size1
    df2=df1.iloc[start:end]
    path_exisit=r"E:\Python文件夹篇\订单表\切割"
    if not os.path.exists(path_exisit):
        os.makedirs(path_exisit)
    path_save1=os.path.join(path_exisit,f"订单表_{i+1}.xlsx")
    size3=end-start
    print(f"第{i+1}个文件,共{size3}行")
    df2.to_excel(path_save1,index=False)

第一行是获得平均分成的5个小文件的行数
后面就根据每个小文件的行数来从生成的订单表.csv中读取数据
然后生成一个新的xlsx文件,并保存到“E:\Python文件夹篇\订单表\切割”这个路径下
这里我们注意到下面这行代码

end=size2*(i+1) if i<4 else size1

如果我们不加if i<4 else size1,那么如果订单表的行数不能被5整除,我们得到的数据就会少几行,大家可以试一试,研究研究。

最后我们给出完整的代码

import pandas as pd  # 导入pandas库,用于数据处理和分析
import numpy as np  # 导入numpy库,用于生成随机数
import os  # 导入os库,用于处理文件和目录

data={
    "ordernum":["order"+str(i).zfill(7) for i in range(1,1999998)],  # 生成订单号,格式为order0000001到order1999997
    "product":np.random.choice(["A","B","C"],size=1999997,replace=True,p=[0.2,0.6,0.2]),  # 生成产品列,随机选择A、B、C,概率分别为0.2、0.6、0.2
    "quantity":np.random.randint(5,100,size=1999997)  # 生成数量列,随机整数在5到99之间
}
df1=pd.DataFrame(data)  # 将字典data转换为DataFrame对象

size1=len(df1)  # 计算DataFrame的长度,即订单数量
path_create=r"E:\Python文件夹篇\订单表\生成"  # 定义生成文件的目录路径
if not os.path.exists(path_create):  # 如果目录不存在
    os.makedirs(path_create)  # 创建目录
    print("创建了新的文件夹")  # 打印提示信息
else:
    print("该文件夹已存在")  # 打印提示信息
path_save=os.path.join(path_create,"订单表.csv")  # 定义保存CSV文件的路径
print(f"{size1}行的订单表已经生成")  # 打印提示信息
df1.to_csv(path_save,index=False)  # 将DataFrame保存为CSV文件,不包含索引
print(f"{size1}行的订单表已经保存到了{path_save}这个路径下")  # 打印提示信息

size2=len(df1)//5  # 计算每个切割文件应包含的行数
for i in range(0,5):  # 循环5次,生成5个文件
    start=size2*i  # 计算当前文件的起始行
    end=size2*(i+1) if i<4 else size1  # 计算当前文件的结束行,最后一个文件包含剩余所有行
    df2=df1.iloc[start:end]  # 根据起始行和结束行切片生成新的DataFrame
    path_exisit=r"E:\Python文件夹篇\订单表\切割"  # 定义切割文件的目录路径
    if not os.path.exists(path_exisit):  # 如果目录不存在
        os.makedirs(path_exisit)  # 创建目录
    path_save1=os.path.join(path_exisit,f"订单表_{i+1}.xlsx")  # 定义保存Excel文件的路径
    size3=end-start  # 计算当前文件的行数
    print(f"第{i+1}个文件,共{size3}行")  # 打印提示信息
    df2.to_excel(path_save1,index=False)  # 将DataFrame保存为Excel文件,不包含索引

我们来看一下最终生成的结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、读者福利–开袋即食可以拿来用的代码

有的读者说想要那种可以直接拿来使用的代码
它来了

import pandas as pd
import numpy as np
import os


path_exisit1=r"D:\分割前的源数据"
filename=str(input("请输入文件名(不带扩展名):"))
filetype=input("请输入文件类型(xlsx/csv):")
path_save1 = os.path.join(path_exisit1, f"{filename}.{filetype}")
if filetype=="xlsx":
    df1 = pd.read_excel(path_save1)
else:
    df1 = pd.read_csv(path_save1)

size1=len(df1)
num=int(input("请输入要划分的份数:"))

size2=len(df1)//num
for i in range(0,num):
    start=size2*i
    end=size2*(i+1) if i<num-1 else size1
    if not os.path.exists(path_save1):
        print(f"错误:文件 {path_save1} 不存在")
        exit(1)
    df2=df1.iloc[start:end]
    path_exisit2=r"D:\分割后的目标数据"
    if not os.path.exists(path_exisit2):
        os.makedirs(path_exisit2)
    path_save2=os.path.join(path_exisit2,f"分割后的小表格_{i+1}.xlsx")
    size3=end-start
    print(f"第{i+1}个文件,共{size3}行")
    df2.to_excel(path_save2,index=False)

我们在我们的D盘新建一个文件夹叫做“分割前的源数据”,接下来把我们要分隔的文件放进这个文件夹,然后把上面的代码在pycahrm运行,运行后底下会显示;
在这里插入图片描述
后面绿色的是我们用户可以自己填的,比如你有一个表格叫做“学生表.xlsx”,你就填“学生表”,文件类型是:xlsx,然后想要分割为几份也可以自己填
最后会在你的D盘生成一个叫做“分割后的目标数据”的文件夹,你在里面就可以看到分割后的数据啦。
在这里插入图片描述

总结

提示:这里对文章进行总结:

OK,今天我们学习了如何将大的表格分割为小的表格,大家可以自行使用上面的代码。
如果运行后有什么地方不对,或者对代码有什么不懂的,都可以在评论区留言或者私信我哈
最后希望大家点个免费的赞或者关注哟,加油加油加油!!!

Logo

一站式 AI 云服务平台

更多推荐