Mit dem Pandas Excelwriter zum StringIO-Objekt schreiben?

8

Ich kann ein StringIO Objekt an pd.to_csv () übergeben:

%Vor%

Aber wenn ich den Excel-Writer benutze, habe ich viel mehr Probleme.

%Vor%

Gibt ein

zurück %Vor%

Ich versuche ein ExcelWriter -Objekt zu erstellen, ohne pd.ExcelWriter() aufzurufen, habe aber einige Probleme. Das habe ich bisher versucht:

%Vor%

Aber jetzt bekomme ich ein AttributeError: 'Workbook' object has no attribute 'write_cells'

Wie kann ich einen Pandas-Datenrahmen im Excel-Format in ein StringIO -Objekt speichern?

    
A User 21.01.2015, 02:21
quelle

3 Antworten

16

Pandas erwartet einen Dateinamenpfad zu den ExcelWriter-Konstruktoren, obwohl jeder der Writer-Engines StringIO unterstützt. Vielleicht sollte das als Bug / Feature-Anfrage in Pandas ausgelöst werden.

In der Zwischenzeit ist hier ein Workaround-Beispiel, das die Pandas xlsxwriter engine verwendet:

%Vor%

Update : Ab Pandas 0.17 ist es nun möglich, dies direkter zu tun:

%Vor%

Siehe auch Speichern der Dataframe-Ausgabe in einer Zeichenfolge in den XlsxWriter-Dokumenten.

    
jmcnamara 21.01.2015, 11:03
quelle
5

Ein Blick auf die pandas.io.excel-Quelle sieht aus, als sollte es kein allzu großes Problem darstellen, wenn es Ihnen nichts ausmacht, xlwt als Ihren Schreiber zu verwenden. Die anderen Engines sind vielleicht auch nicht so schwierig, aber xlwt springt so einfach heraus, da seine Speichermethode einen Stream oder einen Dateipfad benötigt.

Sie müssen zunächst einen Dateinamen eingeben, um Pandas glücklich zu machen, da die Dateinamenserweiterung auf die Engine überprüft wird, um sicherzustellen, dass es sich um ein unterstütztes Format handelt. Im Fall der xlwt-Engine wird der Dateiname jedoch nur in das Pfadattribut des Objekts eingefügt und dann in der Speichermethode verwendet. Wenn Sie das Pfadattribut in Ihren Stream ändern, wird es beim Speichern der Speichermethode in diesem Stream gespeichert.

Hier ist ein Beispiel:

%Vor%

Das ist die schnelle, einfache und leicht dreckige Art, es zu tun. BTW ... ein sauberer Weg, um es zu tun ist, ExcelWriter (oder eine seiner vorhandenen Unterklassen, zB _XlwtWriter) Unterklasse - aber ehrlich gesagt, es ist so wenig in die Aktualisierung der Pfad-Attribut beteiligt, ich habe gewählt, um Ihnen den einfachen Weg zu zeigen, anstatt zu gehen die etwas längere Route.

    
clockwatcher 21.01.2015 04:59
quelle
2

Für diejenigen, die xlsxwriter nicht als engine= für to_excel verwenden, ist hier eine Lösung, um openpyxl im Speicher zu verwenden:

%Vor%

Erklärung: Die Wrapper-Klasse ExcelWriter macht die einzelne Arbeitsmappe der Engine durch die Eigenschaft .book verfügbar. Für openpyxl können Sie dann die Workbook.save -Methode wie gewohnt verwenden!

    
Deano 25.06.2015 19:27
quelle