首页 > 解决方案 > 从 Jupyter Notebook 中的 ipyWidgets 通过 FileUpload 从 MS Word 文档中提取文本

问题描述

我正在尝试允许用户上传 MS Word 文件,然后运行某个函数,该函数将字符串作为输入参数。我正在通过 FileUpload 上传 Word 文件,但是我得到了一个编码对象。我无法使用字节 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

标签: pythonjupyter-notebook

解决方案


现代 ms-word 文件 ( .docx) 实际上是 zip 文件。

文本(但不是页眉)实际上位于word/document.xmlzip 文件中调用的 XML 文档中。

python-docx模块可用于从这些文档中提取文本。它主要用于创建文档,但它可以读取现有文档。示例来自这里

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

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

请注意,这只会从段落中提取文本。不是例如表格中的文本。

编辑

我希望能够通过 FileUpload 小部件上传 MS 文件。

有几种方法可以做到这一点。

首先,隔离实际的文件数据。upload.data实际上是一本字典,看这里。所以做类似的事情:

rawdata = upload.data[0]

(注意这个格式在不同版本的ipywidgets上有所变化。以上示例来自最新版本的文档,请阅读相关版本的文档,或者调查IPython中的数据,并进行相应的调整。)

  1. 写信rawdata给例如foo.docx并打开它。这肯定会奏效,但它似乎有点不优雅。
  2. docx.Document可以处理类似文件的对象。所以你可以创建一个io.BytesIO对象,并使用它。

像这样:

foo = io.BytesIO(rawdata)
doc = docx.Document(foo)

推荐阅读