【问题标题】:Extracting text from MS Word Document uploaded through FileUpload from ipyWidgets in Jupyter Notebook从 Jupyter Notebook 中的 ipyWidgets 通过 FileUpload 从 MS Word 文档中提取文本
【发布时间】:2020-04-05 19:14:38
【问题描述】:

我正在尝试允许用户上传 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

【问题讨论】:

    标签: python jupyter-notebook


    【解决方案1】:

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

    文本(但不是页眉)实际上位于 zip 文件中名为 word/document.xml 的 XML 文档中。

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

    >>> import docx
    >>> gkzDoc = docx.Document('grokonez.docx')
    
    >>> fullText = []
    >>> for paragraph in doc.paragraphs:
    ...     fullText.append(paragraph.text)
    ...
    

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

    编辑

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

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

    首先,隔离实际的文件数据。 upload.data 实际上是一个字典,见here。因此,请执行以下操作:

    rawdata = upload.data[0]
    

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

    1. rawdata到例如foo.docx 并打开它。这肯定行得通,但似乎有点不优雅。
    2. docx.Document 可以处理类似文件的对象。因此,您可以创建一个 io.BytesIO 对象并使用它。

    像这样:

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

    【讨论】:

    • roland 您好,非常感谢您的回复。我使用了你建议的导入 docx 方法,效果很好。但是,如果您要导入自己的 MS Word 文件,则此方法有效。我希望能够通过 FileUpload 小部件上传 MS 文件。有什么想法吗?
    • 我认为你的方法是正确的,但不是upload.data。我已经尝试了这两种方法,但似乎都不起作用。主要是因为upload.data 是一个压缩的list.xml 而upload.value 是一个字典。我尝试了几种方法,但是所有错误都归结为 list/dict 问题。它实际上不是字节文件。 upload.data 的示例输出:[b'PK\x03\x04\x14\x00\x06\x00\x08\x00\x00\x00!\x00\xdf\xa4\xd2lZ\x01\x00\x00 \ x05\x00\x00\x13\x00\x08\x02[Content_Types].xml \xa2\x04\x02(\xa0\x00\x02\x00\x00
    • @MarcHenrySaad 查看更新的答案。显然data 的格式可能会发生变化。
    • 终于成功了!非常感谢您的帮助。我添加了最终代码作为新答案。仅供参考,['content'] 引发错误,因为 upload.data 是内容本身,因此无需再调用内容。
    【解决方案2】:

    调整@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)
    

    【讨论】:

      猜你喜欢
      • 2011-10-06
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      相关资源
      最近更新 更多