解决使用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 相关文章推荐
python完成FizzBuzzWhizz问题(拉勾网面试题)示例
May 05 Python
测试、预发布后用python检测网页是否有日常链接
Jun 03 Python
Python排序搜索基本算法之冒泡排序实例分析
Dec 09 Python
python用BeautifulSoup库简单爬虫实例分析
Jul 30 Python
对python读写文件去重、RE、set的使用详解
Dec 11 Python
python占位符输入方式实例
May 27 Python
Python代码太长换行的实现
Jul 05 Python
解决python中的幂函数、指数函数问题
Nov 25 Python
pytorch中torch.max和Tensor.view函数用法详解
Jan 03 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
Feb 27 Python
Tkinter中复选菜单是否被选中的判断与设置方式
Mar 04 Python
pytorch通过训练结果的复现设置随机种子
Jun 01 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
利用中国天气预报接口实现简单天气预报
2014/01/20 PHP
PHP 搜索查询功能实现
2016/11/29 PHP
PHP替换Word中变量并导出PDF图片的实现方法
2020/11/26 PHP
关于juqery radio写法的兼容性问题(新老版本jquery)
2010/06/14 Javascript
jQuery中$.get、$.post、$.getJSON和$.ajax的用法详解
2014/11/19 Javascript
在JavaScript中正确引用bind方法的应用
2015/05/11 Javascript
直接拿来用的15个jQuery代码片段
2015/09/23 Javascript
Jquery实现仿京东商城省市联动菜单
2015/11/19 Javascript
使用Browserify来实现CommonJS的浏览器加载方法
2017/05/14 Javascript
详解webpack的proxyTable无效的解决方案
2018/06/15 Javascript
基于vue开发微信小程序mpvue-docs跳转页面功能
2019/04/10 Javascript
vue中上传视频或图片或图片和文字一起到后端的解决方法
2019/12/01 Javascript
详解element上传组件before-remove钩子问题解决
2020/04/08 Javascript
解决vue+elementui项目打包后样式变化问题
2020/08/03 Javascript
[02:38]DOTA2超级联赛专访Loda 认为IG世界最强
2013/05/27 DOTA
[04:07]显微镜下的DOTA2第八期——英雄复活动作
2014/06/24 DOTA
django 自定义用户user模型的三种方法
2014/11/18 Python
浅析python协程相关概念
2018/01/20 Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
2019/08/13 Python
Python中turtle库的使用实例
2019/09/09 Python
python 检查数据中是否有缺失值,删除缺失值的方式
2019/12/02 Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
2019/12/23 Python
numpy实现神经网络反向传播算法的步骤
2019/12/24 Python
Python获取excel内容及相关操作代码实例
2020/08/10 Python
Python语言编写智力问答小游戏功能
2020/10/13 Python
广州足迹信息技术有限公司Java软件工程师试题
2014/02/15 面试题
幼儿园教师请假制度
2014/01/16 职场文书
消防安全管理制度
2014/02/01 职场文书
联欢晚会主持词
2014/03/25 职场文书
《大禹治水》教学反思
2014/04/27 职场文书
竞选卫生委员演讲稿
2014/04/28 职场文书
百日安全活动总结
2014/05/04 职场文书
教师党员自我剖析材料
2014/09/29 职场文书
检讨书大全
2015/01/27 职场文书
python使用pygame创建精灵Sprite
2021/04/06 Python
Vue2项目中对百度地图的封装使用详解
2022/06/16 Vue.js