【问题标题】:Read in xlsx in Pandas with openpyxl使用 openpyxl 在 Pandas 中读取 xlsx
【发布时间】:2021-08-27 17:33:36
【问题描述】:

根据我在网上阅读的内容,Pandas read_excel 函数已删除对 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 破坏了它

【问题讨论】:

  • 你的excel表格的来源是什么——是来自其他统计软件吗?我在相同的依赖项和 Python 3.9(在命令行和 VSCode 中)遇到了这个错误,发现只需打开和保存 Excel 工作表(根本不更改任何内容)就可以解决问题。所以它看起来像是 Excel 文件中的某种不寻常的属性或小错误,当您保存时会被删除,并导致 openpyxl 出现问题。我创建了一个issue here
  • 我认为你是对的,我最终解决了这个问题。我认为我的 excel 表来自 matlab

标签: python excel pandas openpyxl


【解决方案1】:

试试这个

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

它适用于引擎 xlrd 和 openpyxl 同时安装 xlrd 以获得更好的体验

pip install xlrd

【讨论】:

  • 同样的错误:/我想知道这是否是文件格式的问题......奇怪的问题
  • 1.尝试升级 openpyxl。 2.pip安装openpyxl_xlsx——升级。或者只像这样使用引擎 xlrd X = pd.ExcelFile("filename.xlsx", engine='xlrd')
【解决方案2】:

.xlsx 工作簿是 xml 文件的压缩存档。根据API reference,工作表的 xml 文件可以包含具有属性syncVertical(没有h)的“工作表属性”元素(<sheetPr>)。但是,在 Excel 中使用 syncVertical 打开工作簿会导致错误,而 synchVertical 可以正常工作。其他软件似乎在使用“错误”拼写创建工作簿时效仿 Excel,而 openpyxl 根据规范仅接受 syncVertical

希望 openpyxl 会跟随其他软件接受错误拼写属性。与此同时,修复是删除该属性。这可以通过在 Excel 中打开工作簿并再次保存来手动完成,这似乎删除了该属性。或者,我们可以调整 this answer 来编辑 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' '))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 2013-05-29
    • 2023-03-27
    • 2017-11-03
    相关资源
    最近更新 更多