Frage

für mit MS Word-Dateien in Python arbeitet, gibt es Python win32-Erweiterungen, die in den Fenstern verwendet werden können. Wie mache ich das gleiche in Linux? Gibt es eine Bibliothek?

War es hilfreich?

Lösung

Sie könnten einen subprocess Anruf an antiword. Antiword ist ein Linux-Kommandozeilen-Dienstprogramm für Text aus einem Word-Dokument Dumping. Funktioniert sehr gut für einfache Dokumente (offensichtlich verliert es Formatierung). Es ist durch apt zur Verfügung, und wahrscheinlich als RPM, oder Sie können es selbst kompilieren.

Andere Tipps

Mit dem nativen Python docx-Modul . Hier ist, wie alle den Text aus einem Dokument extrahieren:

document = docx.Document(filename)
docText = '\n\n'.join([
    paragraph.text.encode('utf-8') for paragraph in document.paragraphs
])
print docText

Siehe Python DocX Website

Überprüfen Sie auch Textract , die aus zieht Tabellen etc.

Parsen von XML mit regexs ruft cthulu. Tun Sie es nicht!

benjamin 's Antwort ist ein ziemlich guter. Ich habe gerade konsolidiert ...

import zipfile, re

docx = zipfile.ZipFile('/path/to/file/mydocument.docx')
content = docx.read('word/document.xml').decode('utf-8')
cleaned = re.sub('<(.|\n)*?>','',content)
print(cleaned)

OpenOffice.org kann mit Python Skript werden. sehen hier

Da OOo meisten MS Word-Dateien einwandfrei laden kann, würde ich sagen, das ist die beste Wahl.

Ich weiß, dass dies eine alte Frage, aber ich wurde vor kurzem einen Weg zu finden versuchen, Text aus MS Word-Dateien zu extrahieren, und die bei weitem beste Lösung fand ich war mit wvLib:

http://wvware.sourceforge.net/

Nachdem die Bibliothek zu installieren, indem es in Python ist ziemlich einfach:

import commands

exe = 'wvText ' + word_file + ' ' + output_txt_file
out = commands.getoutput(exe)
exe = 'cat ' + output_txt_file
out = commands.getoutput(exe)

Und das ist es. Ziemlich viel, was wir tun, ist die commands.getouput Funktion ein paar Shell-Skripte ausführen kann, nämlich wvText (der Text aus einem Word-Dokument extrahiert und Katze die Dateiausgabe zu lesen). Danach wird der gesamte Text aus dem Word-Dokument in dem Out-Variable sein, einsatzbereit.

Hoffentlich wird jemand mit ähnlichen Problemen in der Zukunft helfen.

Hier finden Sie aktuelle wie das doc-Format Werke und erstellen Word-Dokument PHP unter linux verwenden. Ersteres ist besonders nützlich. Abiword ist mein empfohlene Tool. Es gibt Einschränkungen aber:

  

Wenn jedoch das Dokument komplizierte Tabellen, Textfelder, eingebettete Tabellen und so weiter, dann könnte es nicht wie erwartet funktionieren. Die Entwicklung gute MS Word Filter ist ein sehr schwieriger Prozess, so tragen Sie bitte mit uns, wie wir auf dem Erhalten von Word-Dokumenten arbeiten, richtig zu öffnen. Wenn Sie ein Word-Dokument, das Öffnen nicht geladen werden kann, wählen Sie bitte eine Bug und schließen Sie das Dokument so können wir den Importeur verbessern.

(Anmerkung: Ich gepostet auf auch diese Frage , aber es scheint hier relevant, so wenden sie sich bitte die repost entschuldigen.)

Nun, das ist ziemlich hässlich und ziemlich hacky, aber es scheint für grundlegende Textextraktion für mich zu arbeiten. Offensichtlich zu verwenden, um dies in einem Qt-Programm würden Sie haben einen Prozess für sie usw., um laichen, aber die Befehlszeile ich gehackt habe zusammen ist:

unzip -p file.docx | grep '<w:t' | sed 's/<[^<]*>//g' | grep -v '^[[:space:]]*$'

Das ist also:

unzip -p file.docx : -p == "entpacken nach stdout"

grep ': Schnappen Sie nur die Zeilen mit ' ist das Word 2007 XML-Element für "Text", soweit ich sagen kann)

sed 's / <[^ <] > // g' *: Entfernen Sie alles innerhalb von Tags

grep -v '^ [[: space:]] $' *: Entfernen Sie Leerzeilen

Es ist wahrscheinlich eine effizientere Art und Weise, dies zu tun, aber es scheint für mich auf die wenigen Dokumente zu arbeiten ich getestet habe es mit.

Soweit mir bekannt ist, entpacken, grep und alle Ports für Windows und mit einer der Unixes haben sed, so ist es vernünftig Cross-Plattform sein sollte. Despit ein bisschen eines hässlichen Hack ist;)

Wenn Ihre Absicht ist rein Python-Modulen zu verwenden, ohne einen Unterprozess aufrufen, können Sie die Zip-Datei Python modude verwenden.

content = ""
# Load DocX into zipfile
docx = zipfile.ZipFile('/home/whateverdocument.docx')
# Unpack zipfile
unpacked = docx.infolist()
# Find the /word/document.xml file in the package and assign it to variable
for item in unpacked:
    if item.orig_filename == 'word/document.xml':
        content = docx.read(item.orig_filename)

    else:
        pass

Ihr Inhalt Zeichenfolge jedoch werden muss aufgeräumt, ein Weg, dies zu tun, ist:

# Clean the content string from xml tags for better search
fullyclean = []
halfclean = content.split('<')
for item in halfclean:
    if '>' in item:
        bad_good = item.split('>')
        if bad_good[-1] != '':
            fullyclean.append(bad_good[-1])
        else:
            pass
    else:
        pass

# Assemble a new string with all pure content
content = " ".join(fullyclean)

Aber es ist sicherlich ein eleganter Weg, um die Zeichenfolge zu bereinigen, wahrscheinlich die Wieder Modul. Hoffe, das hilft.

Unoconv könnte auch eine gute Alternative sein: http://linux.die.net/man/ 1 / unoconv

Wenn Sie Libreoffice installiert, Sie können einfach von der Kommandozeile aufrufen, die Datei zu konvertieren in Text, dann wird der Text in Python laden.

Ich bin mir nicht sicher, ob Sie ohne Verwendung von COM viel Glück haben werden. Das DOC-Format ist lächerlich komplex und wird oft als „Speicherabbild“ von Word zum Zeitpunkt des Sparens!

genannt

Bei Swati, das ist in HTML, die schön und gut ist, aber die meisten Word-Dokumente sind nicht so schön!

Word 2007 und später Dateien lesen zu können, einschließlich DOCX-Dateien, können Sie verwenden, um die python-docx Paket:

from docx import Document
document = Document('existing-document-file.docx')
document.save('new-file-name.docx')

.doc-Dateien von Word 2003 und früheren Versionen zu lesen, einen subprocess Anruf an antiword. Sie müssen antiword zuerst installieren:

sudo apt-get install antiword

Dann rufen Sie einfach es aus dem Python-Skript:

import os
input_word_file = "input_file.doc"
output_text_file = "output_file.txt"
os.system('antiword %s > %s' % (input_word_file, output_text_file))

Ist das eine alte Frage? Ich glaube, dass so etwas nicht existiert. Es gibt nur beantwortet und unbeantwortet diejenigen. Diese ist ziemlich offen, oder die Hälfte beantwortet, wenn Sie es wünschen. Nun, Methoden zum Lesen * .docx (MS Word 2007 und später) Dokumente ohne COM-Interop zu verwenden, werden alle abgedeckt. Aber Methoden zum Extrahieren von Text aus * .doc (MS Word 97-2000), mit Python nur fehlt. Ist das kompliziert? Zu tun: nicht wirklich zu verstehen. Na ja, das ist eine andere Sache

Wenn ich keine fertige Code gefunden haben, habe ich einige Formatspezifikationen lesen und grub einige vorgeschlagenen Algorithmen in anderen Sprachen aus.

MS Word (* .doc-Datei) ist eine OLE2 Verbunddatei. Nicht dich mit vielen unnötigen Details zu kümmern, denken Sie an es als Dateisystem in einer Datei gespeichert. Es nutzt tatsächlich FAT-Struktur, so dass die Definition hält. (Hm, vielleicht können Sie Loop-Mount es in Linux ???) Auf diese Weise können Sie mehrere Dateien in einer Datei speichern, wie Bilder usw. Das gleiche ist in * .docx getan, indem stattdessen ZIP-Archiv mit. Es gibt Pakete auf PyPI, die OLE-Dateien lesen kann. Wie (olefile, compoundfiles, ...) Ich benutzte compoundfiles Paket * .doc-Datei zu öffnen. in MS Word sind jedoch 97-2000, interne Unterdateien nicht XML oder HTML, sondern Binärdateien. Und da dies nicht genug ist, jede enthält eine Information über andere, so dass Sie mindestens zwei von ihnen zu lesen und gespeicherten Informationen entsprechend entwirren. Um vollständig zu verstehen, lesen Sie das PDF-Dokument, aus dem ich den Algorithmus nahm.

-Code unten ist sehr hastig zusammengesetzt und auf kleine Anzahl von Dateien getestet. Soweit ich sehen kann, es funktioniert wie vorgesehen. Manchmal erscheint einiger Kauderwelsch am Anfang, und fast immer am Ende des Textes. Und es kann ein paar seltsamen Zeichen in-zwischen auch.

Diejenigen, die nur nach Text suchen möchten, werden glücklich sein. Dennoch fordere ich jeden, der diesen Code verbessern helfen kann, dies zu tun.


doc2text module:
"""
This is Python implementation of C# algorithm proposed in:
http://b2xtranslator.sourceforge.net/howtos/How_to_retrieve_text_from_a_binary_doc_file.pdf

Python implementation author is Dalen Bernaca.
Code needs refining and probably bug fixing!
As I am not a C# expert I would like some code rechecks by one.
Parts of which I am uncertain are:
    * Did the author of original algorithm used uint32 and int32 when unpacking correctly?
      I copied each occurence as in original algo.
    * Is the FIB length for MS Word 97 1472 bytes as in MS Word 2000, and would it make any difference if it is not?
    * Did I interpret each C# command correctly?
      I think I did!
"""

from compoundfiles import CompoundFileReader, CompoundFileError
from struct import unpack

__all__ = ["doc2text"]

def doc2text (path):
    text = u""
    cr = CompoundFileReader(path)
    # Load WordDocument stream:
    try:
        f = cr.open("WordDocument")
        doc = f.read()
        f.close()
    except: cr.close(); raise CompoundFileError, "The file is corrupted or it is not a Word document at all."
    # Extract file information block and piece table stream informations from it:
    fib = doc[:1472]
    fcClx  = unpack("L", fib[0x01a2l:0x01a6l])[0]
    lcbClx = unpack("L", fib[0x01a6l:0x01a6+4l])[0]
    tableFlag = unpack("L", fib[0x000al:0x000al+4l])[0] & 0x0200l == 0x0200l
    tableName = ("0Table", "1Table")[tableFlag]
    # Load piece table stream:
    try:
        f = cr.open(tableName)
        table = f.read()
        f.close()
    except: cr.close(); raise CompoundFileError, "The file is corrupt. '%s' piece table stream is missing." % tableName
    cr.close()
    # Find piece table inside a table stream:
    clx = table[fcClx:fcClx+lcbClx]
    pos = 0
    pieceTable = ""
    lcbPieceTable = 0
    while True:
        if clx[pos]=="\x02":
            # This is piece table, we store it:
            lcbPieceTable = unpack("l", clx[pos+1:pos+5])[0]
            pieceTable = clx[pos+5:pos+5+lcbPieceTable]
            break
        elif clx[pos]=="\x01":
            # This is beggining of some other substructure, we skip it:
            pos = pos+1+1+ord(clx[pos+1])
        else: break
    if not pieceTable: raise CompoundFileError, "The file is corrupt. Cannot locate a piece table."
    # Read info from pieceTable, about each piece and extract it from WordDocument stream:
    pieceCount = (lcbPieceTable-4)/12
    for x in xrange(pieceCount):
        cpStart = unpack("l", pieceTable[x*4:x*4+4])[0]
        cpEnd   = unpack("l", pieceTable[(x+1)*4:(x+1)*4+4])[0]
        ofsetDescriptor = ((pieceCount+1)*4)+(x*8)
        pieceDescriptor = pieceTable[ofsetDescriptor:ofsetDescriptor+8]
        fcValue = unpack("L", pieceDescriptor[2:6])[0]
        isANSII = (fcValue & 0x40000000) == 0x40000000
        fc      = fcValue & 0xbfffffff
        cb = cpEnd-cpStart
        enc = ("utf-16", "cp1252")[isANSII]
        cb = (cb*2, cb)[isANSII]
        text += doc[fc:fc+cb].decode(enc, "ignore")
    return "\n".join(text.splitlines())

Nur eine Option zum Lesen 'Doc' Dateien ohne Verwendung von COM: miette . Sollte auf jeder Plattform arbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top