извлечение текста из файлов MS Word в Python - PullRequest
27 голосов
/ 24 сентября 2008

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

Ответы [ 14 ]

31 голосов
/ 30 декабря 2009

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

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

См. Сайт Python DocX

Также посмотрите Textract , который вытаскивает таблицы и т.д.

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

20 голосов
/ 24 сентября 2008

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

13 голосов
/ 28 декабря 2009

benjamin ответ довольно хороший. Я только что объединился ...

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)
11 голосов
/ 24 сентября 2008

OpenOffice.org может быть написан на Python: см. Здесь .

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

5 голосов
/ 01 января 2009

Я знаю, что это старый вопрос, но недавно я пытался найти способ извлечь текст из файлов 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)

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

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

4 голосов
/ 12 ноября 2009

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

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. Надеюсь, это поможет.

4 голосов
/ 11 августа 2009

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

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

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

Так вот:

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

grep ': захватить только строки, содержащие ' - это XML-элемент Word 2007 для "text", насколько я могу скажите)

sed 's / <[^ <] </em>> // g' *: удалить все внутри тегов

grep -v '^ [[: space:]] $' *: удалить пустые строки

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

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

4 голосов
/ 24 сентября 2008

Посмотрите , как работает формат doc и для создания текстового документа с использованием PHP в linux . Первое особенно полезно. Abiword - мой рекомендуемый инструмент. Есть ограничения , хотя:

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

3 голосов
/ 03 августа 2016

Для чтения файлов 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))
3 голосов
/ 08 мая 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...