python - 从 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
解决方案
现代 ms-word 文件 ( .docx
) 实际上是 zip 文件。
文本(但不是页眉)实际上位于word/document.xml
zip 文件中调用的 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中的数据,并进行相应的调整。)
- 写信
rawdata
给例如foo.docx
并打开它。这肯定会奏效,但它似乎有点不优雅。 docx.Document
可以处理类似文件的对象。所以你可以创建一个io.BytesIO
对象,并使用它。
像这样:
foo = io.BytesIO(rawdata)
doc = docx.Document(foo)
推荐阅读
- python - abaqus python(2.7版)使用multiprocessing.Pool(),没有响应
- sql-server - 这些简单的 T-SQL 更新语句是否更新相同?
- verilog - uvm 入门,第 11 章,没有为形式参数“父级”指定实际值
- html - 如何在聚焦元素时避免屏幕阅读器阅读标签变化?
- mongodb - MongoDB Shell中,如何查询某个时间段(比如一个月)的逐日数据
- java - 无法在 Web 服务器上的 Tomcat 中部署 WAR(在 VPS 上,不是本地)
- javascript - 使用 AJAX 上传 CSV 文件时出现内部服务器错误 500
- javascript - 基于 Vue 3 Typescript 的项目中的类型问题
- reactjs - useSWR 变异函数未按预期工作
- angular - .NET 6 中的 Angular 项目