簡體   English   中英

使用 openpyxl 在 Pandas 中讀取 xlsx

[英]Read in xlsx in Pandas with openpyxl

根據我在網上閱讀的內容,Pandas read_excel function 已刪除對 xlsx 文件的支持,但應該很容易閱讀它們,但只需使用 openpyxl 引擎。

當我運行以下命令時,我收到一條錯誤消息,上面寫着“意外的關鍵字參數synchVertical ” 這是我的代碼:

pd.read_excel( path.join(data_dir,"opto_data.xlsx"), engine = 'openpyxl' )

這是我安裝的依賴項...

pandas-1.2.4
openpyxl-3.0.7

我剛剛意識到可能是新版本的 vs-code 破壞了它

嘗試這個

X = pd.ExcelFile("filename.xlsx")
df = X.parse("sheet name here")

它適用於引擎 xlrd 和 openpyxl 還安裝 xlrd 以獲得更好的體驗

pip install xlrd

An.xlsx 工作簿是 xml 文件的壓縮存檔。 根據API 參考,工作表的 xml 文件可以包含帶有屬性syncVertical (沒有h )的“工作表屬性”元素( <sheetPr> )。 但是,在 Excel 中打開帶有syncVertical的工作簿會導致錯誤,而synchVertical工作正常。 其他軟件似乎遵循 Excel 創建具有“錯誤”拼寫的工作簿,而openpyxl僅根據規范接受syncVertical

希望 openpyxl 將跟隨其他軟件接受錯誤拼寫屬性。 與此同時,修復是刪除該屬性。 這可以通過打開 Excel 中的工作簿並再次保存來手動完成,這似乎刪除了該屬性。 或者,我們可以調整此答案以編輯 zip 存檔。 不幸的是,它有點慢,因為它必須讀取和寫入整個檔案才能刪除這個屬性。 作為一個 hacky 快速解決方案,我們使用簡單的查找/替換來取出不需要的屬性。 更好但更慢的解決方案是正確解析 xml 文件。

import tempfile
from zipfile import ZipFile
import shutil
import os
from fnmatch import fnmatch

def change_in_zip(file_name, name_filter, change):
    tempdir = tempfile.mkdtemp()
    try:
        tempname = os.path.join(tempdir, 'new.zip')
        with ZipFile(file_name, 'r') as r, ZipFile(tempname, 'w') as w:
            for item in r.infolist():
                data = r.read(item.filename)
                if fnmatch(item.filename, name_filter):
                    data = change(data)
                w.writestr(item, data)
        shutil.move(tempname, file_name)
    finally:
        shutil.rmtree(tempdir)

change_in_zip("opto_data.xlsx", 
              name_filter='xl/worksheets/*.xml', # the problematic property is found in the worksheet xml files
              change=lambda d: d.replace(b' synchVertical="1"', b' '))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM