【问题标题】:Iterating through imagis in multiple directories with nested for loops, nth loop repeats last item of prior loop - Python在嵌套for循环的多个目录中迭代imagis,第n个循环重复前一个循环的最后一项 - Python
【发布时间】:2020-07-26 02:22:07
【问题描述】:

我的任务是将几批货物的 qc 图片以特定格式移动到 ppt 幻灯片中,并且遇到了几个问题。首先,加载的图片与它们在目录和子目录中的顺序不同。这很重要,因为它们以正确的顺序保存在文件夹中。这也导致它们在幻灯片中以反坐标填充。我的第二个也是最大的问题是第一张幻灯片有 4 张独特的图像,但是之后的每张幻灯片都以与上一张幻灯片上使用的最后一张相同的图像开头,即:

  • 幻灯片 1 = img00、img01、img02、img03
  • 幻灯片 2 = img03、img04、img05、img06
  • 幻灯片 3 = img06、img07、img08、img09

如何在每个循环开始时迭代文件并将它们添加到幻灯片中而不会重复?我有类似于 if i not in condition 的东西,但这会破坏代码。就目前而言,它将创建幻灯片并添加图像,但效果不是很好。类似问题的其他一些答案已经解决了如何构建更好的循环,以及如何从列表中添加/删除重复的项目,但没有解决如何在不接触相同项目两次的情况下迭代项目。任何帮助表示赞赏。

import os
from os import listdir
from os import walk
from pptx import Presentation
from pptx.util import Inches, Pt
import math



prs = Presentation()
path='c:\\Users\\mainuser\\Pictures\\'

sub_dirs=[]
images=[]

for root,dirname,files in os.walk(path):
    sub_dirs.append(root)
    for file in files:
        if file.endswith('.jpg') or file.endswith('.png'):
            images.append(root+'\\'+file)


def create_title_slide():
    title_slide_layout=prs.slide_layouts[0]
    slide=prs.slides.add_slide(title_slide_layout)
    title=slide.shapes.title
    subtitle=slide.placeholders[1]

    title.text="Presentation Title"
    subtitle.text= "Subtitle text"

    prs.save('test.pptx')

def add_slides_with_pictures():

    blank_slide_layout = prs.slide_layouts[6]

    
    left = Inches(0)
    right= Inches(8)
    top = Inches(0)
    bottom = Inches(3)
    width = Inches(2)
    height = Inches(2)

    
    number_of_slides=round(len(images)/4)
   
                         
    for i in range(0,len(images),1):
        for n in range(number_of_slides):
            
   
            slide= prs.slides.add_slide(blank_slide_layout)

            pic00=slide.shapes.add_picture(images[0], left, top, width, height)

            i+=1
           
            pic01=slide.shapes.add_picture(images[i], right, top,width, height)
           
            i+=1
           
            pic02=slide.shapes.add_picture(images[i], right, bottom, width, height)
           
            i+=1
           
            pic03=slide.shapes.add_picture(images[i], left, bottom, width, height)
           
            i+=1

            prs.save('test.pptx')
            

def main():
    create_title_slide()
    add_slides_with_pictures()
       

【问题讨论】:

  • 看起来像舍入问题number_of_slides=round(len(images)/4)。找到的图像数量是四的倍数吗?
  • 4 是我希望在每张幻灯片上显示的图像数量,每个象限一个。
  • 如果图像数量不是四的倍数,那么最后一张幻灯片是什么?如果有 9 张图片,它们将如何呈现?
  • 共有 108 张图片可供使用。有 27 张幻灯片。最后一张幻灯片的下一张包含 img104 作为添加的最终图像。最后一张幻灯片包含 image104 作为添加的第一张图片(104,105,106,107 在最后一张幻灯片上,但不是 108)

标签: python-pptx os.path nested-for-loop


【解决方案1】:

尝试将图像循环更改为以下

for i in range(0,len(images),4):  # each slide has 4 images
    slide = prs.slides.add_slide(blank_slide_layout)
    pic00 = slide.shapes.add_picture(images[i+0], left, top, width, height)
    pic01 = slide.shapes.add_picture(images[i+1], right, top,width, height)
    pic02 = slide.shapes.add_picture(images[i+2], right, bottom, width, height)
    pic03 = slide.shapes.add_picture(images[i+3], left, bottom, width, height)
prs.save('test.pptx')

【讨论】:

  • 我相信这已经解决了问题。我正在打印索引和图像文件路径以检查是否重复,这是我之前所做的,但没有发现重复的文件名。
猜你喜欢
  • 2018-05-14
  • 2020-07-19
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 2014-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多