Python 3.x 使用Python pptx,PowerPoint有哪些条件会导致KeyError?

Python 3.x 使用Python pptx,PowerPoint有哪些条件会导致KeyError?,python-3.x,python-pptx,Python 3.x,Python Pptx,我有一个PowerPoint,我想打开、修改并另存为其他文件名。然而,我得到了一个键错误 我在空白的PowerPoint演示文稿中尝试了这段代码,效果非常好。但是,当我使用该代码打开现有的PowerPoint演示文稿并尝试运行相同的代码时,会出现一个关键错误 KeyError:“存档中没有名为'ppt/slides/NULL'的项目” 我希望通过查找{{{FILTER}}}的所有实例并用列出的值替换它来修改现有的PowerPoint。但是,使用我现有的PowerPoint演示文稿似乎有问题。我没

我有一个PowerPoint,我想打开、修改并另存为其他文件名。然而,我得到了一个键错误

我在空白的PowerPoint演示文稿中尝试了这段代码,效果非常好。但是,当我使用该代码打开现有的PowerPoint演示文稿并尝试运行相同的代码时,会出现一个关键错误

KeyError:“存档中没有名为'ppt/slides/NULL'的项目”

我希望通过查找{{{FILTER}}}的所有实例并用列出的值替换它来修改现有的PowerPoint。但是,使用我现有的PowerPoint演示文稿似乎有问题。我没有空白演示文稿的问题

所以,我想知道是什么原因导致现有的PowerPoint演示文稿出现错误???我计划先做几个“模板”,真的需要知道是否有硬性规定要遵守

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-42-41deffabe2f9> in <module>()
      7 search_str = '{{{FILTER}}}'
      8 repl_str = re.sub(r'[^\w\s]','',(str(list(dashboard_filter2.values()))))
----> 9 ppt = Presentation('HispPres1.pptx')
     10 
     11 for slide in ppt.slides:

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pptx\api.py in Presentation(pptx)
     28         pptx = _default_pptx_path()
     29 
---> 30     presentation_part = Package.open(pptx).main_document_part
     31 
     32     if not _is_pptx_package(presentation_part):

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pptx\opc\package.py in open(cls, pkg_file)
    120         *pkg_file*.
    121         """
--> 122         pkg_reader = PackageReader.from_file(pkg_file)
    123         package = cls()
    124         Unmarshaller.unmarshal(pkg_reader, package, PartFactory)

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pptx\opc\pkgreader.py in from_file(pkg_file)
     34         pkg_srels = PackageReader._srels_for(phys_reader, PACKAGE_URI)
     35         sparts = PackageReader._load_serialized_parts(
---> 36             phys_reader, pkg_srels, content_types
     37         )
     38         phys_reader.close()

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pptx\opc\pkgreader.py in _load_serialized_parts(phys_reader, pkg_srels, content_types)
     67         sparts = []
     68         part_walker = PackageReader._walk_phys_parts(phys_reader, pkg_srels)
---> 69         for partname, blob, srels in part_walker:
     70             content_type = content_types[partname]
     71             spart = _SerializedPart(partname, content_type, blob, srels)

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pptx\opc\pkgreader.py in _walk_phys_parts(phys_reader, srels, visited_partnames)
    102             yield (partname, blob, part_srels)
    103             for partname, blob, srels in PackageReader._walk_phys_parts(
--> 104                     phys_reader, part_srels, visited_partnames):
    105                 yield (partname, blob, srels)
    106 

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pptx\opc\pkgreader.py in _walk_phys_parts(phys_reader, srels, visited_partnames)
    102             yield (partname, blob, part_srels)
    103             for partname, blob, srels in PackageReader._walk_phys_parts(
--> 104                     phys_reader, part_srels, visited_partnames):
    105                 yield (partname, blob, srels)
    106 

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pptx\opc\pkgreader.py in _walk_phys_parts(phys_reader, srels, visited_partnames)
     99             visited_partnames.append(partname)
    100             part_srels = PackageReader._srels_for(phys_reader, partname)
--> 101             blob = phys_reader.blob_for(partname)
    102             yield (partname, blob, part_srels)
    103             for partname, blob, srels in PackageReader._walk_phys_parts(

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pptx\opc\phys_pkg.py in blob_for(self, pack_uri)
    107         matching member is present in zip archive.
    108         """
--> 109         return self._zipf.read(pack_uri.membername)
    110 
    111     def close(self):

~\AppData\Local\Continuum\anaconda3\lib\zipfile.py in read(self, name, pwd)
   1312     def read(self, name, pwd=None):
   1313         """Return file bytes (as a string) for name."""
-> 1314         with self.open(name, "r", pwd) as fp:
   1315             return fp.read()
   1316 

~\AppData\Local\Continuum\anaconda3\lib\zipfile.py in open(self, name, mode, pwd, force_zip64)
   1350         else:
   1351             # Get info object for name
-> 1352             zinfo = self.getinfo(name)
   1353 
   1354         if mode == 'w':

~\AppData\Local\Continuum\anaconda3\lib\zipfile.py in getinfo(self, name)
   1279         if info is None:
   1280             raise KeyError(
-> 1281                 'There is no item named %r in the archive' % name)
   1282 
   1283         return info

KeyError: "There is no item named 'ppt/slides/NULL' in the archive"
---------------------------------------------------------------------------
KeyError回溯(最近一次呼叫最后一次)
在()
7 search_str='{{{{FILTER}}}'
8 repl_str=re.sub(r'[^\w\s]',''(str(列表(仪表板过滤器2.values()))
---->9 ppt=演示文稿('hispres1.pptx')
10
11对于ppt中的幻灯片。幻灯片:
演示文稿中的~\AppData\Local\Continuum\anaconda3\lib\site packages\pptx\api.py(pptx)
28 pptx=_默认值_pptx_路径()
29
--->30演示文稿部分=包装打开(pptx)。主文档部分
31
32如果不是,则为pptx包(演示部分):
~\AppData\Local\Continuum\anaconda3\lib\site packages\pptx\opc\package.py处于打开状态(cls,pkg\u文件)
120*打包文件*。
121         """
-->122 pkg_reader=PackageReader.from_文件(pkg_文件)
123 package=cls()
124解组器。解组器(包装阅读器、包装、零件厂)
~\AppData\Local\Continuum\anaconda3\lib\site packages\pptx\opc\pkgreader.py在from_文件(pkg_文件)中
34 pkg_srels=PackageReader._srels_for(物理读取器,包URI)
35 sparts=分装机装载序列化零件(
--->36物理阅读器,软件包,内容类型
37         )
38 phys_reader.close()
~\AppData\Local\Continuum\anaconda3\lib\site packages\pptx\opc\pkgreader.py in\u load\u serialized\u parts(phys\u reader,pkg\u srels,content\u type)
67 sparts=[]
68部件步行机=包装阅读器。部件步行机(物理阅读器、包装机)
--->69对于零件中的零件名称、blob、SREL:
70内容类型=内容类型[零件名称]
71 spart=_SerializedPart(零件名、内容类型、blob、SREL)
~\AppData\Local\Continuum\anaconda3\lib\site packages\pptx\opc\pkgreader.py in\u walk\u phys\u零件(phys\u阅读器、srels、访问的零件名)
102产量(零件名称、blob、零件名称)
103用于零件名称、blob、srels在PackageReader中的位置。\u walk\u phys\u零件(
-->104物理读取器,部件,访问部件名称):
105产量(零件名称、blob、SREL)
106
~\AppData\Local\Continuum\anaconda3\lib\site packages\pptx\opc\pkgreader.py in\u walk\u phys\u零件(phys\u阅读器、srels、访问的零件名)
102产量(零件名称、blob、零件名称)
103用于零件名称、blob、srels在PackageReader中的位置。\u walk\u phys\u零件(
-->104物理读取器,部件,访问部件名称):
105产量(零件名称、blob、SREL)
106
~\AppData\Local\Continuum\anaconda3\lib\site packages\pptx\opc\pkgreader.py in\u walk\u phys\u零件(phys\u阅读器、srels、访问的零件名)
99个零件名。附加(零件名)
100 part_srels=包装阅读器(物理阅读器,零件名称)
-->101 blob=phys_reader.blob_for(partname)
102产量(零件名称、blob、零件名称)
103用于零件名称、blob、srels在PackageReader中的位置。\u walk\u phys\u零件(
~\AppData\Local\Continuum\anaconda3\lib\site packages\pptx\opc\phys\u pkg.py in blob\u for(self,pack\u uri)
107 zip存档中存在匹配的成员。
108         """
-->109返回self.\u zipf.read(pack\u uri.membername)
110
111 def关闭(自):
读取中的~\AppData\Local\Continuum\anaconda3\lib\zipfile.py(self、name、pwd)
1312 def读取(自身、名称、pwd=无):
1313“返回文件字节(作为字符串)作为名称。”“”
->1314,自开(名称“r”,pwd)为fp:
1315返回fp.read()
1316
~\AppData\Local\Continuum\anaconda3\lib\zipfile.py处于打开状态(self、name、mode、pwd、force_zip64)
1350其他:
1351#获取名称的信息对象
->1352 zinfo=self.getinfo(名称)
1353
1354如果模式=='w':
getinfo中的~\AppData\Local\Continuum\anaconda3\lib\zipfile.py(self,name)
1279如果信息为“无”:
1280上升键错误(
->1281'存档“%name”中没有名为%r的项
1282
1283退货信息
KeyError:“存档中没有名为'ppt/slides/NULL'的项目”

是的,这是一个有点棘手的问题。规范没有提供“断开的”关系(指不存在的包部分的关系),但在某些情况下,至少有一个库(如果我没记错的话,基于Java)没有正确地清理关系,在这种情况下,可能是幻灯片删除操作

解释的要点是:

  • PPTX文件是开放式打包约定(OPC)包。DOCX和XLSX文件是OPC包的其他示例
  • OPC包是由多个部分(官方术语,也许更准确地说是包部分)组成的Zip存档。每个部分本质上都是一个文件,因此类似于
    slide1.xml
    ,它们排列在“目录结构”中
  • 一个部分可以与其他部分相关。例如,演示部分(
    presentation)
    
    ---------------------------------------------------------------------------
    KeyError                                  Traceback (most recent call last)
    <ipython-input-42-41deffabe2f9> in <module>()
          7 search_str = '{{{FILTER}}}'
          8 repl_str = re.sub(r'[^\w\s]','',(str(list(dashboard_filter2.values()))))
    ----> 9 ppt = Presentation('HispPres1.pptx')
         10 
         11 for slide in ppt.slides:
    
    ~\AppData\Local\Continuum\anaconda3\lib\site-packages\pptx\api.py in Presentation(pptx)
         28         pptx = _default_pptx_path()
         29 
    ---> 30     presentation_part = Package.open(pptx).main_document_part
         31 
         32     if not _is_pptx_package(presentation_part):
    
    ~\AppData\Local\Continuum\anaconda3\lib\site-packages\pptx\opc\package.py in open(cls, pkg_file)
        120         *pkg_file*.
        121         """
    --> 122         pkg_reader = PackageReader.from_file(pkg_file)
        123         package = cls()
        124         Unmarshaller.unmarshal(pkg_reader, package, PartFactory)
    
    ~\AppData\Local\Continuum\anaconda3\lib\site-packages\pptx\opc\pkgreader.py in from_file(pkg_file)
         34         pkg_srels = PackageReader._srels_for(phys_reader, PACKAGE_URI)
         35         sparts = PackageReader._load_serialized_parts(
    ---> 36             phys_reader, pkg_srels, content_types
         37         )
         38         phys_reader.close()
    
    ~\AppData\Local\Continuum\anaconda3\lib\site-packages\pptx\opc\pkgreader.py in _load_serialized_parts(phys_reader, pkg_srels, content_types)
         67         sparts = []
         68         part_walker = PackageReader._walk_phys_parts(phys_reader, pkg_srels)
    ---> 69         for partname, blob, srels in part_walker:
         70             content_type = content_types[partname]
         71             spart = _SerializedPart(partname, content_type, blob, srels)
    
    ~\AppData\Local\Continuum\anaconda3\lib\site-packages\pptx\opc\pkgreader.py in _walk_phys_parts(phys_reader, srels, visited_partnames)
        102             yield (partname, blob, part_srels)
        103             for partname, blob, srels in PackageReader._walk_phys_parts(
    --> 104                     phys_reader, part_srels, visited_partnames):
        105                 yield (partname, blob, srels)
        106 
    
    ~\AppData\Local\Continuum\anaconda3\lib\site-packages\pptx\opc\pkgreader.py in _walk_phys_parts(phys_reader, srels, visited_partnames)
        102             yield (partname, blob, part_srels)
        103             for partname, blob, srels in PackageReader._walk_phys_parts(
    --> 104                     phys_reader, part_srels, visited_partnames):
        105                 yield (partname, blob, srels)
        106 
    
    ~\AppData\Local\Continuum\anaconda3\lib\site-packages\pptx\opc\pkgreader.py in _walk_phys_parts(phys_reader, srels, visited_partnames)
         99             visited_partnames.append(partname)
        100             part_srels = PackageReader._srels_for(phys_reader, partname)
    --> 101             blob = phys_reader.blob_for(partname)
        102             yield (partname, blob, part_srels)
        103             for partname, blob, srels in PackageReader._walk_phys_parts(
    
    ~\AppData\Local\Continuum\anaconda3\lib\site-packages\pptx\opc\phys_pkg.py in blob_for(self, pack_uri)
        107         matching member is present in zip archive.
        108         """
    --> 109         return self._zipf.read(pack_uri.membername)
        110 
        111     def close(self):
    
    ~\AppData\Local\Continuum\anaconda3\lib\zipfile.py in read(self, name, pwd)
       1312     def read(self, name, pwd=None):
       1313         """Return file bytes (as a string) for name."""
    -> 1314         with self.open(name, "r", pwd) as fp:
       1315             return fp.read()
       1316 
    
    ~\AppData\Local\Continuum\anaconda3\lib\zipfile.py in open(self, name, mode, pwd, force_zip64)
       1350         else:
       1351             # Get info object for name
    -> 1352             zinfo = self.getinfo(name)
       1353 
       1354         if mode == 'w':
    
    ~\AppData\Local\Continuum\anaconda3\lib\zipfile.py in getinfo(self, name)
       1279         if info is None:
       1280             raise KeyError(
    -> 1281                 'There is no item named %r in the archive' % name)
       1282 
       1283         return info
    
    KeyError: "There is no item named 'ppt/slides/NULL' in the archive"