Search code examples
pandasbinarypicklebytesio

Convert Pandas DataFrame to bytes-like object


Hi I am trying to convert my df to binary and store it in a variable.

my_df:

 df = pd.DataFrame({'A':[1,2,3],'B':[4,5,6]})

my code:

 import io
 towrite = io.BytesIO()
 df.to_excel(towrite)  # write to BytesIO buffer
 towrite.seek(0)  # reset pointer
 

I am getting AttributeError: '_io.BytesIO' object has no attribute 'write_cells'

Full Traceback:

AttributeError                            Traceback (most recent call last)
<ipython-input-25-be6ee9d9ede6> in <module>()
      1 towrite = io.BytesIO()
----> 2 df.to_excel(towrite)  # write to BytesIO buffer
      3 towrite.seek(0)  # reset pointer
      4 encoded = base64.b64encode(towrite.read())  #

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py in to_excel(self, excel_writer, sheet_name, na_rep, float_format, columns, header, index, index_label, startrow, startcol, engine, merge_cells, encoding, inf_rep, verbose, freeze_panes)
   1422         formatter.write(excel_writer, sheet_name=sheet_name, startrow=startrow,
   1423                         startcol=startcol, freeze_panes=freeze_panes,
-> 1424                         engine=engine)
   1425 
   1426     def to_stata(self, fname, convert_dates=None, write_index=True,

C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\formats\excel.py in write(self, writer, sheet_name, startrow, startcol, freeze_panes, engine)
    624 
    625         formatted_cells = self.get_formatted_cells()
--> 626         writer.write_cells(formatted_cells, sheet_name,
    627                            startrow=startrow, startcol=startcol,
    628                            freeze_panes=freeze_panes)

AttributeError: '_io.BytesIO' object has no attribute 'write_cells'

Solution

  • I solved the issue by upgrading pandas to newer version.

     import io
     towrite = io.BytesIO()
     df.to_excel(towrite)  # write to BytesIO buffer
     towrite.seek(0) 
     print(towrite)
     b''
     print(type(towrite))
     _io.BytesIO
    

    if you want to see the bytes-like object use getvalue,

    print(towrite.getvalue())
    b'PK\x03\x04\x14\x00\x00\x00\x08\x00\x00\x00!\x00<\xb