Saltar al contenido

¿Escribir en el objeto StringIO usando Pandas Excelwriter?

Solución:

Pandas espera una ruta de nombre de archivo para los constructores de ExcelWriter, aunque todos los motores de escritura admiten StringIO. Quizás eso debería plantearse como una solicitud de error / función en Pandas.

Mientras tanto, aquí hay un ejemplo de solución usando Pandas xlsxwriter motor:

import pandas as pd
import StringIO

io = StringIO.StringIO()

# Use a temp filename to keep pandas happy.
writer = pd.ExcelWriter('temp.xlsx', engine="xlsxwriter")

# Set the filename/file handle in the xlsxwriter.workbook object.
writer.book.filename = io

# Write the data frame to the StringIO object.
pd.DataFrame().to_excel(writer, sheet_name="Sheet1")
writer.save()
xlsx_data = io.getvalue()

Actualizar: A partir de Pandas 0.17, ahora es posible hacer esto de forma más directa:

# Note, Python 2 example. For Python 3 use: output = io.BytesIO().
output = StringIO.StringIO()

# Use the StringIO object as the filehandle.
writer = pd.ExcelWriter(output, engine="xlsxwriter")

Consulte también Guardar la salida de Dataframe en una cadena en los documentos de XlsxWriter.

Echar un vistazo a la fuente pandas.io.excel parece que no debería ser un gran problema si no le importa usar xlwt como su escritor. Es posible que los otros motores tampoco sean tan difíciles, pero xlwt resulta tan fácil ya que su método de guardado toma una secuencia o una ruta de archivo.

Inicialmente, debe pasar un nombre de archivo solo para hacer felices a los pandas, ya que verifica la extensión del nombre de archivo con el motor para asegurarse de que sea un formato compatible. Pero en el caso del motor xlwt, simplemente introduce el nombre del archivo en el atributo de ruta del objeto y luego lo usa en el método de guardado. Si cambia el atributo de ruta a su flujo, felizmente se guardará en ese flujo cuando llame al método de guardar.

He aquí un ejemplo:

import pandas as pd
import StringIO
import base64

df = pd.DataFrame.from_csv('http://moz.com/top500/domains/csv')
xlwt_writer = pd.io.excel.get_writer('xlwt')
my_writer = xlwt_writer('whatever.xls')  #make pandas happy 
xl_out = StringIO.StringIO()
my_writer.path = xl_out  
df.to_excel(my_writer)
my_writer.save()
print base64.b64encode(xl_out.getvalue())

Esa es la forma rápida, fácil y un poco sucia de hacerlo. Por cierto … una forma más limpia de hacerlo es subclasificar ExcelWriter (o una de sus subclases existentes, por ejemplo, _XlwtWriter) – pero, sinceramente, hay muy poco involucrado en actualizar el atributo de ruta, voté para mostrarte el camino fácil en lugar de ir la ruta un poco más larga.

Para aquellos que no usan xlsxwriter como su engine= por to_excel aquí hay una solución para usar openpyxl en memoria:

in_memory_file = StringIO.StringIO()
xlw = pd.ExcelWriter('temp.xlsx', engine="openpyxl")
# ... do many .to_excel() thingies
xlw.book.save(in_memory_file)
# if you want to read it or stream to a client, don't forget this
in_memory_file.seek(0)

explicación: el ExcelWriter La clase contenedora expone el libro de trabajo individual del motor a través del .book propiedad. Para openpyxl entonces puedes usar el Workbook.save método como de costumbre!

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *