63

There are many questions on this, but there has been no simple answer on how to read an xlsb file into pandas. Is there an easy way to do this?

4
  • No, I don't believe so. Look at this: github.com/pandas-dev/pandas/issues/8540. It's an open issue. You should look at converting it first, somehow. Commented Jul 10, 2017 at 19:07
  • That looks like a pretty old answer there. Was wondering if anything was added into the pandas package recently Commented Jul 11, 2017 at 15:29
  • If the issue is still open, I'm afraid not :/ Commented Jul 11, 2017 at 15:57
  • 1
    Yeah.The issue is still open.For now, I guess I will need to convert it manually to an xlsx file and then read. Commented Jul 11, 2017 at 21:07

6 Answers 6

89

With the 1.0.0 release of pandas - January 29, 2020, support for binary Excel files was added.

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

Notes:

  • You will need to upgrade pandas - pip install pandas --upgrade
  • You will need to install pyxlsb - pip install pyxlsb
Sign up to request clarification or add additional context in comments.

5 Comments

getting ValueError: Unknown engine: pyxlsb. is this engine now built into pandas or do I have to install and import pyxlsb separately?
Need to install it pip3 install pyxlsb its not built in just supported ^^ Look at the notes in the answer.
installed and imported pyxlsb. still getting ValueError: Unknown engine: pyxlsb. is there a trick to importing it?
What version of pandas do you have? pd.show_versions() You don't need to import it. My guess is that there is a mis match in what you installed and what you are running. e.g. did you install it in python2 and run python3 or vice versa? If you run print(pd.show_versions()) it should tell you what you are executing version wise.
why my anaconda python 3's pandas can update to 0.25.1 only?
37

Hi actually there is a way. Just use pyxlsb library.

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])

UPDATE: as of pandas version 1.0 read_excel() now can read binary Excel (.xlsb) files by passing engine='pyxlsb'

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

8 Comments

I was looking for some function builtin within pandas which could do this.
Such does not exist for now.
I tried this but instead of dates that look like a normal dates in excel file ("Feb-20"), I am getting some float numbers in Python like 32874.0. Any ideas on how to fix this?
Yes, Excel remembers dates as floats. Use pandas build in method ".to_datetime()".
thank you ! About dates conversion - it seems Excel numerates dates by integers from 1900-01-01 minus 2 days. So standard to_datetime seems not work.
|
7

Pyxlsb indeed is an option to read xlsb file, however, is rather limited.

I suggest using the xlwings package which makes it possible to read and write xlsb files without losing sheet formating, formulas, etc. in the xlsb file. There is extensive documentation available.

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' in this case is the starting position of the excel table. To write to xlsb file, simply write:

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

1 Comment

This adds a major requirement: you have to have a running instance of Excel. This won't work on Linux machines.
1

Accepted answer only retrieved one sheet from the workbook in my trial. As in Finrod Felagund's answer or retrieving a specific sheet, working hierarchically with specific workbook and worksheet is more accurate.

For ease of use, if you would like to convert xlsb to xlsx easily, I found aspose-cells-python package quite easy to utilize to convert xlsb to xlsx. currently a python version 3.11 environment is sufficient. source website

import aspose.cells 
from aspose.cells import Workbook
workbook = Workbook("input.xlsb")
workbook.save("Output.xlsx")

Comments

0

If you want to read a big binary file or any excel file with some ranges you can directly put at this code

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)

1 Comment

What package needs to be imported for "open_xlsb"?
0

To be able to read xlsb files, it is necessary to have openpyxl installed.

As per https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_excel.html#pandas.read_excel

engine: str, default None

If io is not a buffer or path, this must be set to identify io. Supported engines: “xlrd”, “openpyxl”, “odf”, “pyxlsb”. Engine compatibility :

“xlrd” supports old-style Excel files (.xls).

“openpyxl” supports newer Excel file formats.

“odf” supports OpenDocument file formats (.odf, .ods, .odt).

“pyxlsb” supports Binary Excel files.

Changed in version 1.2.0: The engine xlrd now only supports old-style .xls files. When engine=None, the following logic will be used to determine the engine:

If path_or_buffer is an OpenDocument format (.odf, .ods, .odt), then odf will be used.

Otherwise if path_or_buffer is an xls format, xlrd will be used.

Otherwise if openpyxl is installed, then openpyxl will be used.

Otherwise if xlrd >= 2.0 is installed, a ValueError will be raised.

Otherwise xlrd will be used and a FutureWarning will be raised. This case will raise a ValueError in a future version of pandas.

xlsb reading without index_col:

import pandas as pd

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.