Извлечение текста из документа MS Word, загруженного с помощью FileUpload из ipyWidgets в Jupyter Notebook - PullRequest
1 голос
/ 05 апреля 2020

Я пытаюсь разрешить пользователю загружать файл MS Word, а затем я запускаю определенную функцию, которая принимает строку в качестве входного аргумента. Я загружаю файл Word через FileUpload, но получаю закодированный объект. Я не могу декодировать, используя байт UTF-8 и с помощью upload.value или upload.data просто возвращает закодированный текст

Любые идеи, как я могу извлечь контент из загруженного файла Word?

      > upload = widgets.FileUpload() 
        > upload
#I select the file I want to upload
        > upload.value #Returns coded text 
        > upload.data #Returns coded text

        > #Previously upload['content'] worked, but I read this no longer works in IPYWidgets 8.0

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

Современные файлы ms-word (.docx) на самом деле являются zip-файлами.

Текст (но не заголовки страниц) фактически находится внутри XML документа, называемого word/document.xml в zip-файле. файл.

Модуль python-docx можно использовать для извлечения текста из этих документов. Он в основном используется для создания документов, но он может читать существующие. Пример из здесь .

>>> import docx
>>> gkzDoc = docx.Document('grokonez.docx')

>>> fullText = []
>>> for paragraph in doc.paragraphs:
...     fullText.append(paragraph.text)
...

Обратите внимание, что это будет извлекать текст только из абзацев. Например, текст из таблиц.

Редактировать :

Я хочу иметь возможность загружать MS-файл с помощью виджета FileUpload.

Есть несколько способов сделать это.

Во-первых, изолируйте фактические данные файла. upload.data на самом деле словарь, см. здесь . Так что сделайте что-то вроде:

rawdata = upload.data[0]

(Обратите внимание, что этот формат изменил по сравнению с другой версией ipywidgets. Приведенный выше пример взят из документации к последней версии. Прочитайте соответствующую версию документацию или исследуйте данные в I Python и скорректируйте их соответствующим образом.)

  1. напишите rawdata, например, foo.docx и откройте его. Это, безусловно, сработает, но это выглядит несколько не элегантно.
  2. docx.Document может работать с файловыми объектами. Таким образом, вы можете создать io.BytesIO объект и использовать его.

Вот так:

foo = io.BytesIO(rawdata)
doc = docx.Document(foo)
0 голосов
/ 06 апреля 2020

Настройка с замечательными предложениями @Roland Smith, наконец-то сработал следующий код:

import io
import docx
from docx import Document

    upload = widgets.FileUpload()
    upload

    rawdata = upload.data[0]
    test = io.BytesIO(rawdata)
    doc = Document(test)

    for p in doc.paragraphs:
        print (p.text)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...