您好,登錄后才能下訂單哦!
這篇文章給大家介紹Pandas如何實現取超大的Excel文件,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
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" } | 交易成功 |
執行后的結果:
調試過程中遇到的問題:
1、一開始在for循環的最后沒有增加這兩行代碼
old_excel = xlrd.open_workbook('excel.xls')
new_excel = copy(old_excel)
這樣的話new_excel永遠都是一開始獲取到的那一個,只會把最后一個循環返回的結果寫入文件,因為之前的全部都被一開始獲取的那個old_excel給覆蓋了,所以每次執行完寫入操作以后都要重新做一次copy操作,這樣就能保證new_excel是最新的。
2、注意執行程序之前要把excel關閉,否則會報錯
關于Pandas如何實現取超大的Excel文件就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。