【问题标题】:Read XLSB File in Pandas Python在 Pandas Python 中读取 XLSB 文件
【发布时间】:2017-12-14 15:27:56
【问题描述】:

这方面有很多问题,但是关于如何将 xlsb 文件读入 pandas 并没有简单的答案。有没有简单的方法可以做到这一点?

【问题讨论】:

  • 不,我不这么认为。看看这个:github.com/pandas-dev/pandas/issues/8540。这是一个开放的问题。你应该先看看转换它,不知何故。
  • 那里看起来像是一个很老的答案。想知道最近是否在 pandas 包中添加了任何内容
  • 如果问题仍然存在,恐怕不会:/
  • 是的。问题仍然存在。现在,我想我需要手动将其转换为 xlsx 文件,然后再读取。

标签: python pandas


【解决方案1】:

1.0.0 发布的 pandas -January 29, 2020 添加了对二进制 Excel 文件的支持。

import pandas as pd
df = pd.read_excel('path_to_file.xlsb', engine='pyxlsb')

注意事项:

  • 您需要升级 pandas - pip install pandas --upgrade
  • 您需要安装pyxlsb - pip install pyxlsb

【讨论】:

  • 获取 ValueError:未知引擎:pyxlsb。这个引擎现在是内置在 pandas 中还是我必须单独安装和导入 pyxlsb?
  • 需要安装pip3 install pyxlsb它不是内置的只是支持^^看答案中的注释。
  • 安装并导入pyxlsb。仍然收到ValueError:未知引擎:pyxlsb。导入它有什么技巧吗?
  • 你有什么版本的熊猫? pd.show_versions()你不需要导入它。我的猜测是您安装的内容和正在运行的内容不匹配。例如您是否将其安装在 python2 中并运行 python3 或反之亦然?如果您运行print(pd.show_versions()),它应该会告诉您您正在执行的版本明智。
  • 为什么我的 anaconda python 3 的 pandas 只能更新到 0.25.1?
【解决方案2】:

您好,其实是有办法的。只需使用 pyxlsb 库。

import pandas as pd
from pyxlsb import open_workbook as open_xlsb

df = []

with open_xlsb('some.xlsb') as wb:
    with wb.get_sheet(1) as sheet:
        for row in sheet.rows():
            df.append([item.v for item in row])

df = pd.DataFrame(df[1:], columns=df[0])

更新: 从 pandas 1.0 版开始,read_excel() 现在可以通过传递 engine='pyxlsb' 来读取二进制 Excel (.xlsb) 文件

来源:https://pandas.pydata.org/pandas-docs/version/1.0.0/whatsnew/v1.0.0.html

【讨论】:

  • 我正在寻找可以做到这一点的 pandas 内置函数。
  • 这样的暂时不存在。
  • 我试过这个,但是我在 Python 中得到了一些浮点数,比如 32874.0,而不是看起来像 excel 文件中的正常日期(“Feb-20”)的日期。关于如何解决这个问题的任何想法?
  • 是的,Excel 将日期记住为浮点数。在方法“.to_datetime()”中使用 pandas 构建。
  • 谢谢!关于日期转换 - Excel 似乎用 1900-01-01 减去 2 天的整数来计算日期。所以标准的 to_datetime 似乎不起作用。
【解决方案3】:

Pyxlsb 确实是读取 xlsb 文件的一个选项,但是相当有限。

我建议使用 xlwings 包,它可以读取和写入 xlsb 文件,而不会丢失 xlsb 文件中的表格格式、公式等。有大量可用的文档。

import pandas as pd
import xlwings as xw

app = xw.App()
book = xw.Book('file.xlsb')
sheet = book.sheets('sheet_name')
df = sheet.range('A1').options(pd.DataFrame, expand='table').value
book.close()
app.kill()

本例中的'A1'是excel表格的起始位置。 要写入 xlsb 文件,只需编写:

sheet.range('A1').value = df

【讨论】:

  • 这增加了一个主要要求:您必须有一个正在运行的 Excel 实例。这不适用于 Linux 机器。
【解决方案4】:

如果你想读取一个大的二进制文件或任何具有某些范围的excel文件,你可以直接输入这个代码

range = (your_index_number)
first_dataframe = []
second_dataframe = []
with open_xlsb('Test.xlsb') as wb:
    with wb.get_sheet('Sheet1') as sheet:
        i=0
        for row in sheet.rows():
            if(i!=range):
                first_dataframe.append([item.v for item in row])
                i=i+1
            else:
                second_dataframe.append([item.v for item in row])


first_dataframe = pd.DataFrame(first_dataframe[1:], columns=first[0])
second_dataframe = pd.DataFrame(second_dataframe[:], columns=first.columns)

【讨论】:

  • open_xlsb需要导入什么包?
【解决方案5】:

为了能够读取 xlsb 文件,必须安装 openpyxl。

根据https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_excel.html#pandas.read_excel

引擎:str,默认无

如果 io 不是缓冲区或路径,则必须将其设置为标识 io。支持的引擎:“xlrd”、“openpyxl”、“odf”、“pyxlsb”。引擎兼容性:

“xlrd”支持旧式 Excel 文件 (.xls)。

“openpyxl”支持更新的 Excel 文件格式。

“odf”支持 OpenDocument 文件格式(.odf、.ods、.odt)。

“pyxlsb”支持二进制 Excel 文件。

在 1.2.0 版中更改:引擎 xlrd 现在仅支持旧式 .xls 文件。 当engine=None时,将使用以下逻辑来判断引擎:

如果 path_or_buffer 是 OpenDocument 格式(.odf、.ods、.odt),则将使用 odf。

否则如果path_or_buffer是xls格式,就会使用xlrd。

否则如果安装了openpyxl,则使用openpyxl。

否则,如果安装了 xlrd >= 2.0,则会引发 ValueError。

否则将使用 xlrd 并引发 FutureWarning。这种情况会在未来版本的 pandas 中引发 ValueError。

没有 index_col 的 xlsb 读取:

import pandas as pd

dfcluster = pd.read_excel('c:/xml/baseline/distribucion.xlsb', sheet_name='Cluster', index_col=0, engine='pyxlsb')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 2022-09-23
    相关资源
    最近更新 更多