Вопрос

для работы с файлами MS Word на python существуют расширения python win32, которые можно использовать в Windows.Как мне сделать то же самое в Linux?Есть ли здесь какая-нибудь библиотека?

Это было полезно?

Решение

Вы могли бы вызвать подпроцесс для антислово.Antiword - это утилита командной строки Linux для удаления текста из документа Word.Довольно хорошо работает для простых документов (очевидно, при этом теряется форматирование).Он доступен через apt и, вероятно, как RPM, или вы могли бы скомпилировать его самостоятельно.

Другие советы

Используйте собственный модуль Python docx.Вот как извлечь весь текст из документа doc:

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

Видишь Сайт Python DocX

Также проверьте Текстовыделение который вытаскивает таблицы и т.д.

Синтаксический анализ XML с помощью регулярных выражений вызывает cthulu.Не делай этого!

бенджаминего ответ довольно хорош.Я только что консолидировался...

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 может быть написан с помощью Python: смотрите здесь.

Поскольку OOo может безупречно загружать большинство файлов MS Word, я бы сказал, что это ваш лучший выбор.

Я знаю, что это старый вопрос, но недавно я пытался найти способ извлечения текста из файлов MS Word, и лучшее решение, которое я нашел, было с помощью wvLib:

http://wvware.sourceforge.net/

После установки библиотеки использовать ее в Python довольно просто:

import commands

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

И это все.В значительной степени то, что мы делаем, - это используем функцию commands.getouput для запуска пары сценариев оболочки, а именно wvText (который извлекает текст из документа Word, и cat для чтения выходных данных файла).После этого весь текст из документа Word будет в переменной out, готовый к использованию.

Надеюсь, это поможет всем, у кого возникнут подобные проблемы в будущем.

Взгляните на как работает формат doc и создание документа Word с использованием PHP в Linux.Первое особенно полезно. Абислово это мой рекомендуемый инструмент.Есть такие ограничения хотя:

Однако, если документ содержит сложные таблицы, текстовые поля, встроенные электронные таблицы и так далее, то он может работать не так, как ожидалось.Разработка хороших фильтров MS Word - очень сложный процесс, поэтому, пожалуйста, проявите терпение, пока мы работаем над корректным открытием документов Word.Если у вас не загружается документ Word, пожалуйста, откройте Ошибку и включите документ, чтобы мы могли улучшить импортер.

(Примечание:Я разместил это на этот вопрос также, но здесь это кажется уместным, поэтому, пожалуйста, извините за репост.)

Это довольно уродливо и довольно халтурно, но, похоже, у меня это работает для базового извлечения текста.Очевидно, что для использования этого в программе Qt вам пришлось бы создать для этого процесс и т.д., но командная строка, которую я взломал вместе, выглядит так:

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

Так что это:

разархивировать -p file.docx:-p == "распаковать в стандартный файл"

grep ':Возьмите только строки, содержащие '<w:t' (<w:t=""> это XML-элемент Word 2007 для "текста", насколько я могу судить)

сэд с/<[^<]>//g'*:Удалите все, что находится внутри тегов

grep -v '^[[:пробел:]]$'*:Удаление пустых строк

Вероятно, есть более эффективный способ сделать это, но, похоже, он работает для меня в нескольких документах, с которыми я его тестировал.

Насколько мне известно, unzip, grep и sed имеют порты для Windows и любой из Unix-версий, поэтому они должны быть достаточно кроссплатформенными.Несмотря на то, что это немного уродливый взлом ;)

Если вы намерены использовать исключительно модули python без вызова подпроцесса, вы можете использовать zipfile python modude.

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

Однако ваша строка содержимого должна быть очищена, один из способов сделать это:

# 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)

Но, несомненно, есть более элегантный способ очистить строку, вероятно, с помощью модуля re.Надеюсь, это поможет.

Unoconv также может быть хорошей альтернативой: http://linux.die.net/man/1/unoconv

Если у вас установлена LibreOffice, вы можете просто вызвать его из командной строки, чтобы преобразовать файл в текст, затем загрузите текст в Python.

Я не уверен, что вам сильно повезет без использования COM.Формат .doc смехотворно сложен, и его часто называют "дампом памяти" Word во время сохранения!

В Swati это в формате HTML, что прекрасно, но большинство документов Word не так хороши!

Для чтения файлов Word 2007 и более поздних версий, включая файлы .docx, вы можете использовать python-docx упаковка:

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

Чтобы прочитать файлы .doc из Word 2003 и более ранних версий, выполните вызов подпроцесса антислово.Сначала вам нужно установить antiword:

sudo apt-get install antiword

Затем просто вызовите его из вашего скрипта python:

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))

Это старый вопрос?Я считаю, что такой вещи не существует.Есть только те, на которые есть ответы, и те, которые остались без ответа.На этот вопрос практически нет ответа, или, если хотите, наполовину дан ответ.Что ж, все методы чтения документов * .docx (MS Word 2007 и более поздних версий) без использования COM-взаимодействия описаны.Но методов для извлечения текста из *.doc (MS Word 97-2000), использующих только Python, не хватает.Неужели это так сложно?Делать:не совсем, чтобы понять:ну, это уже совсем другое дело.

Когда я не нашел готового кода, я прочитал некоторые спецификации формата и откопал несколько предложенных алгоритмов на других языках.

Файл MS Word (*.doc) представляет собой составной файл OLE2.Чтобы не утруждать вас множеством ненужных деталей, думайте об этом как о файловой системе, хранящейся в файле.На самом деле в нем используется структура ЖИРА, так что определение остается в силе.(Хм, может быть, вы можете смонтировать его в цикле в Linux ???) Таким образом, вы можете хранить больше файлов внутри файла, например, изображений и т.д.То же самое делается в * .docx, используя вместо этого ZIP-архив.В PyPI доступны пакеты, которые могут читать OLE-файлы.Например (olefile, compoundfiles, ...) Я использовал пакет compoundfiles для открытия файла * .doc.Однако в MS Word 97-2000 внутренними вложенными файлами являются не XML или HTML, а двоичные файлы.И поскольку этого недостаточно, каждый из них содержит информацию о другом, поэтому вы должны прочитать по крайней мере два из них и соответствующим образом расшифровать сохраненную информацию.Чтобы полностью понять, прочтите PDF-документ, из которого я взял алгоритм.

Приведенный ниже код составлен наспех и протестирован на небольшом количестве файлов.Насколько я могу видеть, это работает так, как задумано.Иногда какая-то тарабарщина появляется в начале и почти всегда в конце текста.И между ними также могут быть какие-то странные символы.

Те из вас, кто просто хочет выполнить поиск по тексту, будут счастливы.Тем не менее, я настоятельно призываю всех, кто может помочь улучшить этот код, сделать это.


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())

Просто опция для чтения файлов "doc" без использования COM: miette.Должен работать на любой платформе.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top