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
odt- in txt-Format umwandeln
- 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
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
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, 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
@Nobuddy: noisefloor hat doch die Dokumentation verlinkt. Da gibt es auch einen Abschnitt zur Installation.
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.
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.
Fehlermeldung:
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')
- 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
@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.
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:
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, 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
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
@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.
`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: Also ich hatte mir nur die ersten beiden Beispiele unter „Usage“ auf der PyPI-Seite von `pypandoc` angeschaut und kurz drüber nachgedacht.
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.
[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.
@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()
@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.