【问题标题】:python-pptx not able to extract text from certain Powerpoint Presentations, but others work finepython-pptx 无法从某些 Powerpoint 演示文稿中提取文本,但其他工作正常
【发布时间】:2020-04-04 17:20:33
【问题描述】:

尝试从 .pptx 文件的大目录中提取文本字段,以下脚本非常适合某些 Powerpoint 演示文稿:

from pptx import Presentation
import glob

f = open("Scraped PPTX Data.txt", "a", encoding='utf-8')
for eachfile in glob.glob("*.pptx"):
    prs = Presentation(eachfile)
    for slide in prs.slides:
        for shape in slide.shapes:
            if hasattr(shape, "text"):
                f.write(shape.text)

f.close()

然而在许多其他人(似乎是非常大的人)上,我收到了这个巨大的错误墙:

  File "C:\Users\GLD-POS3\Desktop\SIGNS\PPT_Scraper.py", line 9, in <module>
    prs = Presentation(eachfile)
  File "C:\Users\GLD-POS3\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pptx\api.py", line 28, in Presentation
    presentation_part = Package.open(pptx).main_document_part
  File "C:\Users\GLD-POS3\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pptx\opc\package.py", line 125, in open
    pkg_reader = PackageReader.from_file(pkg_file)
  File "C:\Users\GLD-POS3\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pptx\opc\pkgreader.py", line 37, in from_file
    phys_reader, pkg_srels, content_types
  File "C:\Users\GLD-POS3\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pptx\opc\pkgreader.py", line 70, in _load_serialized_parts
    for partname, blob, srels in part_walker:
  File "C:\Users\GLD-POS3\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pptx\opc\pkgreader.py", line 106, in _walk_phys_parts
    phys_reader, part_srels, visited_partnames
  File "C:\Users\GLD-POS3\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pptx\opc\pkgreader.py", line 106, in _walk_phys_parts
    phys_reader, part_srels, visited_partnames
  File "C:\Users\GLD-POS3\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pptx\opc\pkgreader.py", line 103, in _walk_phys_parts
    blob = phys_reader.blob_for(partname)
  File "C:\Users\GLD-POS3\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pptx\opc\phys_pkg.py", line 111, in blob_for
    return self._zipf.read(pack_uri.membername)
  File "C:\Users\GLD-POS3\AppData\Local\Programs\Python\Python37-32\lib\zipfile.py", line 1432, in read
    return fp.read()
  File "C:\Users\GLD-POS3\AppData\Local\Programs\Python\Python37-32\lib\zipfile.py", line 885, in read
    buf += self._read1(self.MAX_N)
  File "C:\Users\GLD-POS3\AppData\Local\Programs\Python\Python37-32\lib\zipfile.py", line 989, in _read1
    self._update_crc(data)
      File "C:\Users\GLD-POS3\AppData\Local\Programs\Python\Python37-32\lib\zipfile.py", line 917, in  _update_crc
raise BadZipFile("Bad CRC-32 for file %r" % self.name)
zipfile.BadZipFile: Bad CRC-32 for file 'ppt/media/image170.jpeg'

【问题讨论】:

  • 试着用python-pptx 打开那个文件,看看你是否得到同样的错误。我打赌你会的。听起来像是损坏的 .pptx 文件。检查是否使用 PowerPoint 将其打开(或许还可以修复),看看是否无法修复文件。
  • 用python-pptx打开了其中一个pptx,并且被允许了。某些 pptx 似乎确实已损坏,但我刚刚收到与确认未损坏的相同的错误。

标签: python-3.x file-io powerpoint python-pptx


【解决方案1】:

当您看到 Python 异常时,通常应该先检查结尾。 在这种情况下,它说:

文件 'ppt/media/image170.jpeg' 的 CRC-32 错误

这里要知道的是,pptx 文件基本上只是一个带有花哨名称的 zip 文件。

尝试运行python -m zipfile -l filename.pptx 那应该列出 pptx 文件的内容。 一般来说,一个pptx文件包含一堆xml文件和一堆图片等媒体文件。

从错误消息中,您可以看到为 image170.jpeg 计算的校验和 (CRC = cyclic redundancy check) 与 zipfile 中存储的值不匹配。

AFAICT,没有办法告诉ZipFile 忽略 CRC 错误。

问题是,在提取文本时,您可能只需要读取 zip 文件内 ppt/slides/slideN.xml 文件夹中的 XML 文件。您根本不需要访问图像。

尝试使用zipfile.ZipFile 打开无效文件并手动从ppt/slides 中的XML 文件中提取文本。

【讨论】:

  • 那么这意味着我的 PowerPoint 有问题吗?我有数百个需要从中删除数据。
  • @ITboi49 Python 计算 CRC 的方式有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-12
  • 2015-11-17
  • 2013-03-24
相关资源
最近更新 更多