Word-Dokumente einlesen

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
Barcellona
User
Beiträge: 74
Registriert: Dienstag 25. Mai 2010, 12:10

Hallo zusammen,

ich versuche gerade über Python verschiedene Textformate einzulesen und würde auch gerne die Word-Formate .doc und .docx einlesen.
Wenn ich ein Word-Dokument im Texteditor öffne, bekomme ich da aber jede Menge "komisches Zeug".

Hat jemand eine Idee, wie ich den Text filtern könnte, so dass ich nur den wirklichen Text einlese?
:K
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

".doc"-Dokumente sind eben binär, ".docx" zum Teil auch. "docx" ist durch die ISO wohl zertifiziert, mit dem nötigen Kleingeld kannst Du also die Spezifikation erwerben und einen Parser dafür schreiben. Generell ist das wohl XML basiert, zwischen den Tags gibt es aber wohl teilweise auch binäres Zeugs.

Um es kurz zu machen: Das ganze dürfte außer für Spezialfälle eher kein Unterfangen sein, dass man selber als Einzelperson stemmen kann ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Barcellona
User
Beiträge: 74
Registriert: Dienstag 25. Mai 2010, 12:10

Danke für die Antwort.

docx und doc kann ich dann also vergessen...

Welche Textformate wären doch noch leicht einzulesen? (außer .txt...)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Definiere "einlesen" und was hast du denn vor?

Es gibt jede Menge Text-Formate, die Plaintext sind und man trotzdem nicht einfach einlesen, im Sinne von parsen, oder voneinander unterscheiden kann.
Barcellona
User
Beiträge: 74
Registriert: Dienstag 25. Mai 2010, 12:10

Ich möchte eine Art Texteditor schreiben, der verschiedene Formate lesen kann.
Bisher lese ich nur .txt-Dateien ein und würde das Ganze gerne erweitern.

Zumindest 1-2 Formate, die auch Infos über kursiv,fettgedruckt, etc. beinhalten.

Hat da wer eine Idee, welches Format ich leicht einlesen könnte.
Sprich unnötige Infos herausfiltern und nur den Text samt wichtigen Informationen speichern.

Output könnte dann sowas in der Art sein:

<b>Dies ist ein Titel<b>
Dies die <i>erste<i> Zeile.

Nur als Idee...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

"Richtext" wäre da evtl. etwas.

Ansonsten eben markdown, creole, ... ;-)

Ach ja und ODF eben - das ist ja sogar offen dokumentiert!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Barcellona
User
Beiträge: 74
Registriert: Dienstag 25. Mai 2010, 12:10

ODF sieht gut für meinen Zweck aus :D - danke
Barcellona
User
Beiträge: 74
Registriert: Dienstag 25. Mai 2010, 12:10

Habe jetzt mal eine .odt-Datei erstellt, aber wenn ich diese mit Scite öffne, bekomme ich wieder nur ein Misch-Masch
aus komischen Zeichen :|

Wie kann ich denn wohl die .odt-Datei als utf-8-Encoding speichern?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

ODF ist eine gezippte Ordnerstruktur mit XML-Dateien und kein Plaintext.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

cofi hat geschrieben:ODF ist eine gezippte Ordnerstruktur mit XML-Dateien und kein Plaintext.
Man kann damit sogar im Bedarfsfall unter Umgehung einer passenden API für ODF arbeiten. Dabei öffnet man mit dem zipfile-Modul die Datei, liest die content.xml aus, manipuliert diese und schreibt sie wieder zurück. Für einfaches Suchen und Ersetzen funktioniert das problemlos.
Barcellona
User
Beiträge: 74
Registriert: Dienstag 25. Mai 2010, 12:10

Das hört sich interessant an. Bekomme allerdings den Fehler "File is not a zip file" bei dem Versuch eine odt zu öffnen.

Hast du vielleicht Beispielcode, wie man die Datei öffnet?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

http://lmgtfy.com/?q=python+open+odf

Wenn du deinen bisherigen Code postest waere das hilfreicher. Ausserdem: Ist die Datei valide, kannst du sie ohne Python entpacken?
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Einige Archiv-Programme weigern sich unter Windows, Archive ohne Endung .zip zu entpacken. Lösung: Einfach die Datei von .odt auf .zip umbenennen.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Barcellona hat geschrieben:Das hört sich interessant an. Bekomme allerdings den Fehler "File is not a zip file" bei dem Versuch eine odt zu öffnen.

Hast du vielleicht Beispielcode, wie man die Datei öffnet?
So könnte Öffnen, Ändern und Schreiben aussehen. Bitte passende Fehlerbehandlung dazudenken.

Code: Alles auswählen

import zipfile

f = zipfile.ZipFile("filename.odt, "a")
f.extract("content.xml")
with open("content.xml") as c:
    data = c.read()

data.replace("foo", "bar")
            
with open("content.xml", "w") as c:
    c.write(data)
        
f.write("content.xml")
f.close()
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wobei man da das lxml-Modul nutzen möchte ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

/me: Syntax Highlighting ist schon praktisch, nicht wahr? :wink:
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Hyperion hat geschrieben:Wobei man da das lxml-Modul nutzen möchte ;-)
Ja, natürlich möchte man das. Aber nicht hier im Beispiel. :P
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Code: Alles auswählen

data = data.replace("foo", "bar")
Stefan
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

sma hat geschrieben:

Code: Alles auswählen

data = data.replace("foo", "bar")
Du hast natürlich recht. Code zu schreiben ohne zu testen führt gerne zu Syntax- oder Logikfehlern.
Barcellona
User
Beiträge: 74
Registriert: Dienstag 25. Mai 2010, 12:10

Vielen Dank für das Beispiel! :D

Klappt wunderbar, verstehe nur nicht alles im Code.

Vielleicht kann mir jemand kurz noch erklären, was an den kommentierten Stellen passiert, wäre sehr nett.
Danke!

Code: Alles auswählen

import zipfile

def read_odt(path):
    f = zipfile.ZipFile(path, "a")  # wieso "a"? a=append, oder?
    f.extract("content.xml")
    
    with open("content.xml") as c: # ist content.xml nun ausserhalb des odt-Dokumentes verfügbar? wegen extract?
        data = c.read() 

    data=data.replace("test", "changed") 
                
    with open("content.xml", "w") as c:
        c.write(data) 

     
    f.write("content.xml")
    f.close()
    
read_odt("test.odt")
Antworten