python办公自动化--使用将csv大文件分割为xlsx小文件
python将大文件分割为小文件
系列文章目录
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,今天我们学习了如何将大的表格分割为小的表格,大家可以自行使用上面的代码。
如果运行后有什么地方不对,或者对代码有什么不懂的,都可以在评论区留言或者私信我哈
最后希望大家点个免费的赞或者关注哟,加油加油加油!!!
更多推荐




所有评论(0)