解决使用Pandas 读取超过65536行的Excel文件问题


Posted in Python onNovember 10, 2020

场景

今天需要合并天猫订单数据,由于前期6.18活动有很多数据需要处理,将几个月份合并一起,结果报错。

解决使用Pandas 读取超过65536行的Excel文件问题

问题分析

Excel 文件的格式曾经发生过一次变化,在 Excel 2007 以前,使用扩展名为 .xls 格式的文件,这种文件格式是一种特定的二进制格式,最多支持 65,536 行,256 列表格。从 Excel 2007 版开始,默认采用了基于 XML 的新的文件格式 .xlsx ,支持的表格行数达到了 1,048,576,列数达到了 16,384。需要注意的是,将 .xlsx 格式的文件转换为 .xls 格式的文件时,65536 行和 256 列之后的数据都会被丢弃。

Pandas 读取 Excel 文件的引擎是 xlrd , xlrd 虽然同时支持 .xlsx 和 .xls 两种文件格式,但是在源码文件 xlrd/sheet.py 中限制了读取的 Excel 文件行数必须小于 65536,列数必须小于 256。

if self.biff_version >= 80:
  self.utter_max_rows = 65536
else:
  self.utter_max_rows = 16384
self.utter_max_cols = 256

这就导致,即使是 .xlsx 格式的文件, xlrd 依然不支持读取 65536 行以上的 Excel 文件(源码中还有一个行数限制是 16384,这是因为 Excel 95 时代, xls 文件所支持的最大行数是 16384)。

解决办法

openpyxl 是一个专门用来操作 .xlsx 格式文件的 Python 库,和 xlrd 相比它对于最大行列数的支持和 .xlsx 文件所定义的最大行列数一致。

首先安装 openpyxl :

pip install openpyxl

Pandas 的 read_excel 方法中,有 engine 字段,可以指定所使用的处理 Excel 文件的引擎,填入 openpyxl ,再读取文件就可以了。

import os
import pandas as pd

# 将文件读取出来放一个列表里面

pwd = '1' # 获取文件目录

# 新建列表,存放文件名
file_list = []

# 新建列表存放每个文件数据(依次读取多个相同结构的Excel文件并创建DataFrame)
dfs = []

for root,dirs,files in os.walk(pwd): # 第一个为起始路径,第二个为起始路径下的文件夹,第三个是起始路径下的文件。
  for file in files:
    file_path = os.path.join(root, file)
    file_list.append(file_path) # 使用os.path.join(dirpath, name)得到全路径
    df = pd.read_excel(file_path) # 导入xlsx文件,将excel转换成DataFrame
    dfs.append(df)

# 将多个DataFrame合并为一个
df = pd.concat(dfs)

# 数据输出,写入excel文件,不包含索引数据
# 数据写入 Excel,需要首先安装一个 engine,由 engine 负责将数据写入 Excel,pandas 使用 openpyx 或 xlsxwriter 作为写入引擎。
df.to_excel('test\\1.xlsx', index=False,engine='openpyxl') # 导出 Excel,一般不需要索引,将 index 参数设为 False

补充知识:python使用xlrd读取excel数据作为requests的请求参数,并把返回的数据写入excel中

实现功能:

从excel中的第一列数据作为post请求的数据,数据为json格式;把post返回的结果写入到excel的第二列数据中,并把返回数据与excel中的预期结果做比较,如果与预期一致则在案例执行结果中写入成功,否则写入失败。

每一行的数据都不一样,可实现循环调用

# !/usr/bin/env python
# -*- coding:utf-8 -*-
#import xlwt #这个专门用于写入excel的库没有用到
import xlrd
from xlutils.copy import copy
import requests
import json
old_excel = xlrd.open_workbook('excel.xls')
sheet = old_excel.sheets()[0]
url = 'http://10.1.1.32:1380/service/allocFk2'
headers = {'Content-Type': 'application/json'}
i = 0
new_excel = copy(old_excel)
for row in sheet.get_rows():
  data = row[0].value
  response = requests.post(url=url, headers=headers, data=data)
  text = response.text
  #使用json.loads可以把Unicode类型,即json类型转换成dict类型
  text = json.loads(text)["returnMsg"] #屏蔽这行代码即可把返回的完整数据写入文件中
  ws = new_excel.get_sheet(0)
  ws.write(i,1,text)
  new_excel.save('excel.xls')
  old_excel = xlrd.open_workbook('excel.xls')
  new_excel = copy(old_excel)
  i = i+1

执行前的excel格式:

发送报文 返回报文 校验字符 案例执行结果
{ "projectId" :"0070", "projectAllocBatch" :"1", "serviceCode" :"GT012", "seqNo" :"180800272201GT51286712", "tranTimeStamp" :"20180817102244", "sign" :"2dbb89a6bd86b2af1ff6a76c35c05284" } 交易失败
{ "projectId" :"0070", "projectAllocBatch" :"1", "serviceCode" :"GT012", "seqNo" :"180800272201GT51286713", "tranTimeStamp" :"20180817102244", "sign" :"2dbb89a6bd86b2af1ff6a76c35c05284" } 交易失败
{ "projectId" :"0070", "projectAllocBatch" :"1", "serviceCode" :"GT012", "seqNo" :"180800272201GT51286713", "tranTimeStamp" :"20180817102244", "sign" :"2dbb89a6bd86b2af1ff6a76c35c05284" } 交易成功

执行后的结果:

解决使用Pandas 读取超过65536行的Excel文件问题

调试过程中遇到的问题:

1、一开始在for循环的最后没有增加这两行代码

old_excel = xlrd.open_workbook('excel.xls')

new_excel = copy(old_excel)

这样的话new_excel永远都是一开始获取到的那一个,只会把最后一个循环返回的结果写入文件,因为之前的全部都被一开始获取的那个old_excel给覆盖了,所以每次执行完写入操作以后都要重新做一次copy操作,这样就能保证new_excel是最新的。

2、注意执行程序之前要把excel关闭,否则会报错

以上这篇解决使用Pandas 读取超过65536行的Excel文件问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
easy_install python包安装管理工具介绍
Feb 10 Python
python监控网卡流量并使用graphite绘图的示例
Apr 27 Python
python使用正则表达式检测密码强度源码分享
Jun 11 Python
Python的类实例属性访问规则探讨
Jan 30 Python
python实现根据窗口标题调用窗口的方法
Mar 13 Python
python正则表达式及使用正则表达式的例子
Jan 22 Python
Django unittest 设置跳过某些case的方法
Dec 26 Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
May 03 Python
Python实现病毒仿真器的方法示例(附demo)
Feb 19 Python
python datetime时间格式的相互转换问题
Jun 11 Python
在Keras中利用np.random.shuffle()打乱数据集实例
Jun 15 Python
如何将anaconda安装配置的mmdetection环境离线拷贝到另一台电脑
Oct 15 Python
python各种excel写入方式的速度对比
Nov 10 #Python
Python 使用xlwt模块将多行多列数据循环写入excel文档的操作
Nov 10 #Python
详解vscode实现远程linux服务器上Python开发
Nov 10 #Python
Python调用飞书发送消息的示例
Nov 10 #Python
python中pyplot基础图标函数整理
Nov 10 #Python
python图片合成的示例
Nov 09 #Python
python 实现"神经衰弱"翻牌游戏
Nov 09 #Python
You might like
AJAX的跨域访问-两种有效的解决方法介绍
2013/06/22 PHP
PHP计算2点经纬度之间的距离代码
2013/08/12 PHP
Php-Redis安装测试笔记
2015/03/05 PHP
ThinkPHP表单令牌错误的相关解决方法分析
2016/05/20 PHP
PHP实现的观察者模式实例
2017/06/21 PHP
Javascript - HTML的request类
2006/07/15 Javascript
JavaScript 基础知识 被自己遗忘的
2009/10/15 Javascript
使用jQuery内容过滤选择器选择元素实例讲解
2013/04/18 Javascript
Nodejs异步回调的优雅处理方法
2014/09/25 NodeJs
浅谈javascript 函数内部属性
2015/01/21 Javascript
jquery实现仿新浪微博带动画效果弹出层代码(可关闭、可拖动)
2015/10/12 Javascript
JS针对浏览器窗口关闭事件的监听方法集锦
2016/06/24 Javascript
用jQuery实现圆点图片轮播效果
2017/03/19 Javascript
JS+HTML5 FileReader实现文件上传前本地预览功能
2020/03/27 Javascript
js canvas实现简单的图像扩散效果
2020/06/28 Javascript
webpack3.0升级4.0的方法步骤
2020/04/02 Javascript
Javascript执行上下文顺序的深入讲解
2020/11/04 Javascript
关于JavaScript中异步/等待的用法与理解
2020/11/18 Javascript
在Python中定义和使用抽象类的方法
2016/06/30 Python
Django实现学生管理系统
2019/02/26 Python
python实现海螺图片的方法示例
2019/05/12 Python
python3+PyQt5 数据库编程--增删改实例
2019/06/17 Python
PyQt5多线程刷新界面防假死示例
2019/12/13 Python
Python Pickle 实现在同一个文件中序列化多个对象
2019/12/30 Python
CSS3实现线性渐变用法示例代码详解
2020/08/07 HTML / CSS
HTML5+JS实现俄罗斯方块原理及具体步骤
2013/11/29 HTML / CSS
医药营销专业个人自荐信
2013/09/29 职场文书
七一表彰活动方案
2014/01/18 职场文书
大学生通用个人的自我评价
2014/02/10 职场文书
《蚂蚁和蝈蝈》教学反思
2014/02/24 职场文书
陈胜吴广起义口号
2014/06/20 职场文书
个人债务授权委托书
2014/10/17 职场文书
精神病医院见习报告
2014/11/03 职场文书
教你使用一行Python代码玩遍童年的小游戏
2021/08/23 Python
解决redis批量删除key值的问题
2022/03/23 Redis
SpringBoot项目部署到阿里云服务器的实现步骤
2022/06/28 Java/Android