前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python小工具:CSV文件分割神器2.0

Python小工具:CSV文件分割神器2.0

作者头像
披头
发布2020-03-12 18:14:47
3.6K6
发布2020-03-12 18:14:47
举报
文章被收录于专栏:datartisandatartisan

工作中需要处理一个700多W行的csv文件,要求将csv文件按照100W行进行分割,以便可以用excel打开,找了几个脚本,处理小文件都差不多,但是当我尝试处理这个大文件时,代码效率就凸显出来了,有的程序半个小时都处理不完,有的只要十几秒,今天把这个高效的代码分享给大家。

首先获取待处理文件名称

代码语言:javascript
复制
file_name = input('请输入文件名称(包含路径): ')

增加源文件编码格式判断代码如下:

代码语言:javascript
复制
import chardet
f = open(file_name, 'rb')lines = f.readline()file_code = chardet.detect(lines)['encoding']

修改读取文件代码

代码语言:javascript
复制
with open(file_name, 'r', encoding=file_code) as f:    csv_file = f.readlines()

定义csv分割行数

代码语言:javascript
复制
linesPerFile = 1000000

初始化文件编号为1

代码语言:javascript
复制
filecount = 1

以0为起点,文件行数为终点,分片大小为间隔,循环遍历文件,每次遍历行数即为分片大小,而不是每行遍历一次

代码语言:javascript
复制
for i in range(0, len(csv_file), linesPerFile):

打开目标文件准备写入,不存在则创建

代码语言:javascript
复制
with open(file_name[:-4] + '_' + str(filecount) + '.csv', 'w+') as f:

判断是否为第一个文件,不是的话需要先写入标题行

代码语言:javascript
复制
if filecount > 1:    f.write(csv_file[0])

批量写入i至i+分片大小的多行数据

代码语言:javascript
复制
f.writelines(csv_file[i:i+linesPerFile])

完成一个文件写入之后,文件编号增加1

代码语言:javascript
复制
filecount += 1

至此,主程序基本完成了,可以采用time函数在程序处理前后进行打点计时,统计处理耗时。

代码语言:javascript
复制
st = time.time()et = time.time()cost_time = et - stprint('处理完成,程序运行时间:{}秒'.format(float('%.2f' % cost_time)))

我处理700多W行的csv文件,耗时在15s以内,小伙伴们可以试试。

回复 csv2 获取CSV文件分割神器2.0版本

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 乐享数据8090 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档