odt- in txt-Format umwandeln

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Nobuddy
User
Beiträge: 996
Registriert: Montag 30. Januar 2012, 16:38

Hallo zusammen,

möchte Dateien im odt-Format in das txt-Format umwandeln.
Welche Möglichkeiten gibt es da mit Python, bzw. welche Module sind dafür geeignet?

Grüße Nobuddy
BlackJack

@Nobuddy: Man könnte LibreOffice als externes Programm zum Umwandeln aufrufen.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

http://textract.readthedocs.io/en/latest/ scheint das zu können.

Ansonsten sollte das auch von Hand gehen. ODT-Dateien sind AFAIK auch "nur" Zip-Dateien, die eine Reihe von XML-Dateien enthalten, von der eine (oder mehrere?) den eigentlich Text enthalten. Diesen könnte man sich dann mit einem XML-Parser "rausholen".

Gruß, noisefloor
Nobuddy
User
Beiträge: 996
Registriert: Montag 30. Januar 2012, 16:38

Hallo zusammen,

@BlackJack, LibreOffice für die Umwandlung zu verwenden, wäre eine Möglichkeit. Mir wäre es lieber dies mit Python umsetzen zu können.

@noisefloor, das mit dem XML-Parser, werde ich mal versuchen.
Sorry, wollte ja zu textrac noch etwas schreiben.
Habe das beim Googeln auch gesehen, konnte aber nicht das Python-Modul ermitteln, welches installiert werden muss!?

Grüße Nobuddy
BlackJack

@Nobuddy: noisefloor hat doch die Dokumentation verlinkt. Da gibt es auch einen Abschnitt zur Installation.
Nobuddy
User
Beiträge: 996
Registriert: Montag 30. Januar 2012, 16:38

Ja, habe es mir schon angeschaut und installiert.
Mal schauen, wie ich damit klar komme.

Grüße Nobuddy
nezzcarth
User
Beiträge: 1635
Registriert: Samstag 16. April 2011, 12:47

Schau doch mal, ob pandoc mit deinen odt-Dateien gut klar kommt. Das kann odt lesen und abgesehen von txt-Dateien in diversen Varianten auch verschiedene andere Formate erzeugen. Es existiert auch eine Python-Library. Wenn es aber nur um einfache "Massenkonvertierung" geht, reicht auch eine einfache Schleife in der Shell.
Nobuddy
User
Beiträge: 996
Registriert: Montag 30. Januar 2012, 16:38

@nezzcarth, Danke für den Hinweis, werde mir das auch mal genauer anschauen.

Grüße Nobuddy
Nobuddy
User
Beiträge: 996
Registriert: Montag 30. Januar 2012, 16:38

Komme momentan mit pypandoc nicht klar.

Zum Testen, verwende ich eine Datei '/home/user/dokument.odt'.
Dieses möchte ich in das Format 'markdown' umwandeln.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# For Python3.x

import pypandoc

filepath = '/home/user/dokument.odt'
output = pypandoc.convert_file(filepath, 'odt', format='markdown')
Fehlermeldung:
  • Traceback (most recent call last):
    File "pandoc.py", line 8, in <module>
    output = pypandoc.convert_file(filepath, 'odt', format='txt')
    File "/usr/local/lib/python3.4/dist-packages/pypandoc/__init__.py", line 140, in convert_file
    outputfile=outputfile, filters=filters)
    File "/usr/local/lib/python3.4/dist-packages/pypandoc/__init__.py", line 262, in _convert_input
    format, to = _validate_formats(format, to, outputfile)
    File "/usr/local/lib/python3.4/dist-packages/pypandoc/__init__.py", line 223, in _validate_formats
    _get_base_format(format), ', '.join(from_formats)))
    RuntimeError: Invalid input format! Got "txt" but expected one of these: docbook, haddock, html, json, latex, markdown, markdown_github, markdown_mmd, markdown_phpextra, markdown_strict, mediawiki, native, opml, rst, textile
BlackJack

@Nobuddy: So weit ich das sehe sagst Du es soll die Datei /home/user/dokument.odt, die mit Markdown ausgezeichneter Text sein soll, in das ODT-Format konvertiert werden soll. Das ist ziemlich sicher nicht richtig. Zumal es sein kann, das die Datei auch schon nicht mehr das ursprüngliche Dokument enthält wenn Du das mehr als einmal versucht hast ODT in ODT zu wandeln und dabei aber zu behaupten die Quelltextdatei sei etwas anderes als ODT. Denn Du hast keinen Dateinamen für das Ergebnis angegeben, was ziemlich sicher dazu führt das die Datei überschrieben wird, weil die ja bereits die Endung *.odt besitzt.
Nobuddy
User
Beiträge: 996
Registriert: Montag 30. Januar 2012, 16:38

Hmm, pypandoc ist komplizierter als texttrac, zumindest fehlt mir das das Verständnis für die Umsetzung.
BlackJack, die Datei wurde nicht überschrieben, noch sonst wie verändert.

Ich habe mal folgendes getestet:

Code: Alles auswählen

filepath = '/home/user/Gedichte_01.odt'
output = pypandoc.convert_text(filepath, 'md', format='md')
print(output)
> /home/user/Gedichte\_01.odt
Wenn ich das richtig sehe, wird filepath als String behandelt und in das Format md umgewandelt.

Ich gehe mal davon aus, wenn ich den Inhalt einer Datei konvertieren möchte, muss dies mit 'pypandoc.convert_file' umgesetzt werden.
Nur ist mir noch nicht klar wie?

Grüße Nobuddy
BlackJack

@Nobuddy: Das `format`-Argument macht keinen Sinn. Das ist das Quellformat und sinnvoll wenn sich das aus der Dateiendung nicht ermitteln lässt oder nicht genau ermitteln lässt. Und Deine ODT-Datei liegt nicht im Markdown-Format vor und da gibt es auch keine Varianten von.

`format` ist sinnvoll wenn die Dateiendung beispielsweise *.txt ist, aber eines der vielen Auszeichnungsformate enthält die Pandoc versteht, und man das extra angeben muss. Oder wenn die Endung *.md ist, aber man nicht das Default-Markdown sondern eine der vielen Erweiterungen verwendet hat und das deshalb extra spezifizieren muss.
Nobuddy
User
Beiträge: 996
Registriert: Montag 30. Januar 2012, 16:38

@BlackJack, Danke für Deine Info!

Die Doku, was ich bis jetzt gesehen habe, ist für mich nicht verständlich.
Da fehlen einfach Beispiele, die das Ganze verdeutlichen.

Grüße Nobuddy
BlackJack

@Nobuddy: Also ich hatte mir nur die ersten beiden Beispiele unter „Usage“ auf der PyPI-Seite von `pypandoc` angeschaut und kurz drüber nachgedacht.
nezzcarth
User
Beiträge: 1635
Registriert: Samstag 16. April 2011, 12:47

Ich hatte pandoc vorgeschlagen, weil das doch eigentlich recht intuitiv zu bedienen ist. Und wenn du wirklich nur mehrere Dateien konvertieren möchtest, reicht (da du ja scheinbar unter Linux arbeitest) eigentlich schon so was in der Art:

[codebox=bash file=Unbenannt.bsh]
for file in *.odt; do
base=$(basename $file .odt)
pandoc $file -o "${base}.txt"
done
[/code]

In Python würde das -- unter Verwendung von z.B. 'os' und 'glob' -- ähnlich aussehen, aber ein bisschen länger. Meiner Meinung nach lohnt sich das Python-Modul vor allem, wenn du nicht einfach nur von einer Datei in eine neue konvertieren möchtest, sondern etwas mehr mit den Daten vor hast, bzw. mehr Verarbeitungslogik vorgesehen ist.
BlackJack

@nezzcarth: Doch das Modul (`pypandoc`) ist hauptsächlich zum Aufrufen des Programms zum Umwandeln gedacht. Also um es etwas kürzer zu machen als wenn man selbst etwas mit `subprocess` strickt. Dein Shell-Skript in Python:

Code: Alles auswählen

#!/usr/bin/env python
import os
from glob import iglob

import pypandoc


def main():
    for filename in iglob('*.odt'):
        output_filename = os.path.splitext(filename)[0] + '.txt'
        pypandoc.convert_file(filename, 'plain', outputfile=output_filename)


if __name__ == '__main__':
    main()
nezzcarth
User
Beiträge: 1635
Registriert: Samstag 16. April 2011, 12:47

@BlackJack: Alles klar, danke für den Hinweis. Ich habe bisher daraus eigentlich nur convert_text verwendet (zum Beispiel, um in einer Datenbank abgelegte Texte, die HTML enthalten zu konvertieren und extrahieren) und vielleicht zu sehr solche Anwendungszwecke vor Augen.
Antworten