溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Pandas如何實現(xiàn)取超大的Excel文件

發(fā)布時間:2020-11-11 15:24:18 來源:億速云 閱讀:1893 作者:Leah 欄目:開發(fā)技術(shù)

這篇文章給大家介紹Pandas如何實現(xiàn)取超大的Excel文件,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

Pandas 讀取 Excel 文件的引擎是 xlrd , xlrd 雖然同時支持 .xlsx 和 .xls 兩種文件格式,但是在源碼文件 xlrd/sheet.py 中限制了讀取的 Excel 文件行數(shù)必須小于 65536,列數(shù)必須小于 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 文件(源碼中還有一個行數(shù)限制是 16384,這是因為 Excel 95 時代, xls 文件所支持的最大行數(shù)是 16384)。

解決辦法

openpyxl 是一個專門用來操作 .xlsx 格式文件的 Python 庫,和 xlrd 相比它對于最大行列數(shù)的支持和 .xlsx 文件所定義的最大行列數(shù)一致。

首先安裝 openpyxl :

pip install openpyxl

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

import os
import pandas as pd

# 將文件讀取出來放一個列表里面

pwd = '1' # 獲取文件目錄

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

# 新建列表存放每個文件數(shù)據(jù)(依次讀取多個相同結(jié)構(gòu)的Excel文件并創(chuàng)建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轉(zhuǎn)換成DataFrame
    dfs.append(df)

# 將多個DataFrame合并為一個
df = pd.concat(dfs)

# 數(shù)據(jù)輸出,寫入excel文件,不包含索引數(shù)據(jù)
# 數(shù)據(jù)寫入 Excel,需要首先安裝一個 engine,由 engine 負責將數(shù)據(jù)寫入 Excel,pandas 使用 openpyx 或 xlsxwriter 作為寫入引擎。
df.to_excel('test\\1.xlsx', index=False,engine='openpyxl') # 導出 Excel,一般不需要索引,將 index 參數(shù)設為 False

補充知識:python使用xlrd讀取excel數(shù)據(jù)作為requests的請求參數(shù),并把返回的數(shù)據(jù)寫入excel中

實現(xiàn)功能:

從excel中的第一列數(shù)據(jù)作為post請求的數(shù)據(jù),數(shù)據(jù)為json格式;把post返回的結(jié)果寫入到excel的第二列數(shù)據(jù)中,并把返回數(shù)據(jù)與excel中的預期結(jié)果做比較,如果與預期一致則在案例執(zhí)行結(jié)果中寫入成功,否則寫入失敗。

每一行的數(shù)據(jù)都不一樣,可實現(xiàn)循環(huán)調(diào)用

# !/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類型轉(zhuǎn)換成dict類型
  text = json.loads(text)["returnMsg"] #屏蔽這行代碼即可把返回的完整數(shù)據(jù)寫入文件中
  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

執(zhí)行前的excel格式:

發(fā)送報文返回報文校驗字符案例執(zhí)行結(jié)果
{ "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" }交易成功

執(zhí)行后的結(jié)果:

Pandas如何實現(xiàn)取超大的Excel文件

調(diào)試過程中遇到的問題:

1、一開始在for循環(huán)的最后沒有增加這兩行代碼

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

new_excel = copy(old_excel)

這樣的話new_excel永遠都是一開始獲取到的那一個,只會把最后一個循環(huán)返回的結(jié)果寫入文件,因為之前的全部都被一開始獲取的那個old_excel給覆蓋了,所以每次執(zhí)行完寫入操作以后都要重新做一次copy操作,這樣就能保證new_excel是最新的。

2、注意執(zhí)行程序之前要把excel關閉,否則會報錯

關于Pandas如何實現(xiàn)取超大的Excel文件就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI