Seite 1 von 1

Exceltabellen in Python

Verfasst: Mittwoch 20. Februar 2008, 15:12
von VitroN
Hallo,
da mein Informatik-Lehrer meinte, dass es recht einfach wäre in Python eine Exceltabelle zu erzeugen bzw. einzulesen, ich jedoch schon einmal hier im Forum deswegen gefragt habe und da etwas anderes gehört hab, will ich nochmal ganz kontret hier fragen...
Also, folgender Sachverhalt: Ich möchte mit Hilfe der Funktion

Code: Alles auswählen

f = file('Dateinname.xls', 'r')
eine Exceldatei mit einer Namensliste (Name, Nachname nebeneinander in den Zellen A1, B1, A2, B2 usw.) einlesen und anschliessend, nach ein paar Veränderungen, auch wieder speichern.

So, jetzt meine Frage:
Ist dies problemlos bzw. mit wenig Aufwand möglich oder empfiehlt es sich ehr eine Textdatei (.txt) zu verwenden?

Vielen Dank für eure Antworten
VitroN

Re: Exceltabellen in Python

Verfasst: Mittwoch 20. Februar 2008, 15:27
von Leonidas
VitroN hat geschrieben:So, jetzt meine Frage:
Ist dies problemlos bzw. mit wenig Aufwand möglich oder empfiehlt es sich ehr eine Textdatei (.txt) zu verwenden?
Letzteres oder eine CSV-Datei verwenden. Die Excel-Tabellen würde ich nicht parsen, denn die ist 349 Seiten land und das würde ich nicht implementieren wollen. Joel zeigt praktikablere Ansätze.

Re: Exceltabellen in Python

Verfasst: Mittwoch 20. Februar 2008, 15:54
von gerold
Hallo VitroN!
VitroN hat geschrieben:da mein Informatik-Lehrer meinte, dass es recht einfach wäre in Python eine Exceltabelle zu erzeugen bzw. einzulesen
Es ist einfach, wenn man Windows und ein installiertes Excel zur Verfügung hat. Suche hier im Forum nach "Excel" und du wirst mehrere Möglichkeiten finden. Lies einfach alles durch was du mit diesem Stichwort findest. Dann weißt du Bescheid.
VitroN hat geschrieben:Ich möchte mit Hilfe der Funktion

Code: Alles auswählen

f = file('Dateinname.xls', 'r')
eine Exceldatei mit einer Namensliste (Name, Nachname nebeneinander in den Zellen A1, B1, A2, B2 usw.) einlesen und anschliessend, nach ein paar Veränderungen, auch wieder speichern.
Nein, das wird nichts. Du kannst eine Excel-BINÄRDATEI nicht wie eine Textdatei behandeln. Entweder du verwendest COM um über Excel auf die Datei zuzugreifen oder du verwendest ODBC um über Excel auf die Datei zuzugreifen.

Wenn es dir nur um einen einfachen Datenexport und Datenimport geht, dann speichere die Excel-Datei als CSV-Datei ab und verwende in Python das csv-Modul.

mfg
Gerold
:-)

Verfasst: Mittwoch 20. Februar 2008, 15:57
von lunar
Nur um das nochmal klarzustellen: Mit "open" kann man nicht "mal eben so" eine Excel-Datei lesen. Den dafür benötigten Parser bringt Python nicht mit, und afaik gibt es auch kein Python-Modul dafür!

Der einzige, praktikable Weg ist COM, was aber nur unter Windows funktioniert.

Die Aussage deines Informatiklehrers ist also nicht wirklich gerechtfertigt. Unter Linux ist es nicht leicht, Excel-Dateien zu lesen!

Verfasst: Mittwoch 20. Februar 2008, 17:06
von numerix
da mein Informatik-Lehrer meinte, dass es recht einfach wäre in Python eine Exceltabelle zu erzeugen bzw. einzulesen
"Recht einfach" ist natürlich eine sehr dehnbare Formulierung. Und auch, was er mit "Exceltabelle" meint, könnte mehrdeutig sein - leider wird ja "Excel" häufig synonym zu "Tabellenkalkulation" verwendet, so dass "Exceltabelle" möglicherweise nicht mehr als "Rechenblatt" bedeuten soll und er gar nicht unbedingt an eine Datei im xls-Format gedacht hat. Liegt die Tabelle im csv-Format vor, dann ist es wahrhaftig nicht so schwierig.

Falls der Lehrer doch an eine echte xls-Datei gedacht hat, dann würde ich ihn an deiner Stelle mal fragen, wie ER das denn "recht einfach" machen würde. So wie ich dich verstanden habe, ist die Lösung dieses Problems ja keine Hausaufgabe, so dass Hilfe vom Lehrer denkbar wäre (zumal wenn er so eine Äußerung tätigt).

Re: Exceltabellen in Python

Verfasst: Mittwoch 20. Februar 2008, 17:45
von veers
Leonidas hat geschrieben:Joel zeigt praktikablere Ansätze.
Joel Spolsky hat geschrieben:All of these subtle bits of behavior cannot be fully documented without writing a document that has the same amount of information as the Excel source code.
...Von welchem Softwaregiganten kenne ich diese Argumentation nur.... :roll:

Verfasst: Mittwoch 20. Februar 2008, 18:30
von BlackJack
@lunar: Hast Du Erfahrung mit xlrd oder warum ist COM der einzig praktikable Weg?

Verfasst: Mittwoch 20. Februar 2008, 18:39
von jens
Da wir schon mal dabei sind... Wie sieht es mit OpenOffice aus? Die Excel Dateien in OO laden und dann irgendwie in Python laden, aber wie?

Verfasst: Mittwoch 20. Februar 2008, 18:49
von BlackVivi
jens hat geschrieben:Da wir schon mal dabei sind... Wie sieht es mit OpenOffice aus? Die Excel Dateien in OO laden und dann irgendwie in Python laden, aber wie?
Python + OpenOffice = Gelber Schnee.

Immernoch umständlich, immernoch schwierig.

Verfasst: Mittwoch 20. Februar 2008, 19:18
von lunar
BlackJack hat geschrieben:@lunar: Hast Du Erfahrung mit xlrd oder warum ist COM der einzig praktikable Weg?
Nein, ich kannte die Bibliothek einfach nur nicht. Als Linuxer und überzeugter Anhänger freier Software hat man halt nicht viel mit Excel zu tun ;)
jens hat geschrieben:Da wir schon mal dabei sind... Wie sieht es mit OpenOffice aus? Die Excel Dateien in OO laden und dann irgendwie in Python laden, aber wie?
OpenOffice kann Excel laden, und es gibt UNO-Bindings für Python. Theoretisch steht dem also nichts im Weg, praktisch begegnet man sehr schnell der UNO-API, gegen die COM wie der siebte Himmel aussieht.

Die UNO-API stützt sich auf die selben Design-Prinzipien wie CORBA. So verwendet UNO ebenfalls IDL als Definitionsprache für Schnittstellen. In der API schlägt sich das schon so nieder, dass jede konkrete Klasse eine gleichwertige abstrakte Schnittstelle hat, auch wenn es nur eine einzige konkrete Implementation dieser Schnittstelle gibt. Außerdem entwickelt UNO komplizierteste Vererbungshierarchien. Dadurch ist die API extrem kompliziert, weitaus mehr, als der Notwendigkeit angemessen wäre. In Verbindung mit einer für Python-Entwickler ziemlich schlechten Dokumentation ist das tödlich. Diese Dokumentation ist eine genaue Repräsentation des UNO-Objektbaums, inklusive aller Schnittstellen. Diese API lässt sich aber natürlich prinzipbedingt nicht vollständig auf Python übertragen, so dass man vor der undankbaren Aufgabe steht, sich aus geschätzten 1000 Klassen die 100 rauszusuchen, mit denen man tatsächlich zu tun haben könnte.

Das es besser geht, zeigt kross, die neue Skripting-Engine von KOffice. KSpread mit Python anzusteuern, ist vom Standpunkt der API betrachtet ein reines Vergnügen. Allerdings war kross vor einem halben Jahr, als ich es getestet habe, reichlich unausgereift, was sich desöfteren in gewissen Merkwürdigkeiten gezeigt hat. Außerdem sind die Excel-Konverter von KOffice bei weitem nicht so gut wie die von OpenOffice.

Verfasst: Mittwoch 20. Februar 2008, 19:23
von Hyperion
Wobei man bei OO.org relativ schnell auf einzelnen Zellen zugreifen kann. Ist ja nur gezipptes xml und wirklich leicht zu durchschauen. Natürlich kommt es auf die Komplexität des Problems an.

Für KOffice gibt es ein schönes Python-Modul. Aber generell ist der Weg über CSV-Files ist wohl doch der praktikabelste ...

Verfasst: Donnerstag 21. Februar 2008, 06:46
von VitroN
Auch wenn ich die letzten paar Beiträge nicht verstehe, weil ich mich mit der Materie so tiefgehend nie beschäftig hab, sag ich mal VIELEN DANK. Ich werd meinen Infolehrer einfach mal fragen, wie er sich das vorstellt...wollte nur halt vorher bisschen besser Bescheid wissen und nicht vollkommen blöd dastehen ;-)

Verfasst: Donnerstag 21. Februar 2008, 11:58
von Leonidas
@BlackJack: xlrd kann aber so wie ich das sehe nur lesen und der OP hatte, so wie ich das lese, auch vor darin zu schreiben. Dann ist xlrd + COM weniger sinnvoll, weil man dann auch COM nehmen kann. Insgesamt ist COM im Vergleich zu dem was OpenOffice.org bietet eigentlich recht angenehm zu benutzen. Kross kannte ich nicht, aber wesentlich grausamer als OOo ist ja sowieso kaum möglich ;)

Verfasst: Donnerstag 21. Februar 2008, 12:01
von jens
Also ich für meinen Fall, werde dann doch lieber den CSV Export aus OO machen und damit weiterarbeiten. Ist eh nur für eine einmalige Export-/Import Geschichte gedacht ;)