繁体   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