作为对我前一个问题的this answer的回复,我写了以下简短的程序来尝试重现这个问题。
from pptx import Presentation
from io import BytesIO
p = Presentation()
slide = p.slides.add_slide(p.slide_layouts[0])
slide.shapes[0].text = 'asdf'
p.save('test.pptx')
out = BytesIO()
p.save(out)
out_file = open('bytes_test.pptx', 'wb', buffering=0)
out_file.write(out.read())
out_file.close()
这产生了两个pptx文件。
第一个,test.pptx,包含一个带有“标题幻灯片”布局并包含字符串“asdf”的幻灯片。文件大小为28 KB。
第二个,bytes_test.pptx,在PowerPoint中打开时,只显示一个大的灰色框,上面写着“点击添加第一张幻灯片”。文件大小为0。
使用Anaconda Python 3.6.1和python-pptx 0.6.6在Windows 10上运行
为什么会这样?
答案 0 :(得分:2)
嗯,我能想到的一些事情,这可能需要一些来回。
首先,我会尝试使用out.getvalue()
代替out.read()
。这就是我总是如何做到这一点,其记录的行为是获取流的全部内容。
如果这不起作用,我会在out.flush()
来电之前添加out.seek(0)
和out.read()
。 BytesIO
是缓冲输出流,并且可能在read()
调用之前将某些缓冲数据写入流中。此外,我希望read()
从当前光标位置开始工作,seek(0)
调用将重置为文件的开头。
让我们知道你如何使用它,我们将从那里开始。