【问题标题】:Why need with statements for reader and writer be nested?为什么需要嵌套读者和作者的 with 语句?
【发布时间】:2017-11-03 17:00:05
【问题描述】:
with open(pdf,'rb') as fin:
    reader = PyPDF2.PdfFileReader(fin)
    new_pdf = PyPDF2.PdfFileWriter()

    for i in range(reader.numPages):
        new_pdf.addPage(reader.getPage(i))

    out_file = pdf if not create_copy else self._new_copy(pdf)
    with open(out_file,'wb') as fout:
        new_pdf.write(fout)

这在编写副本时按预期工作。

现在让我们将最后三行移出with

with open(pdf,'rb') as fin:
    reader = PyPDF2.PdfFileReader(fin)
    new_pdf = PyPDF2.PdfFileWriter()

    for i in range(reader.numPages):
        new_pdf.addPage(reader.getPage(i))

out_file = pdf if not create_copy else self._new_copy(pdf)
with open(out_file,'wb') as fout:
    new_pdf.write(fout)

这会创建一个具有正确页数的 pdf,所有页面都是空白的,甚至在写入新文件时。 (请注意,将 new_pdf = ... 移出也不会改变任何内容)

为什么?我能做些什么呢?因为我希望最终必须将这三行移出第一个with,以便提供覆盖支持。 (除非我只是创建一个副本然后重命名,我有点想避免这种情况。)

【问题讨论】:

  • 在第一种情况下打开同一个文件进行读写是否真的有效if not create_copy
  • @AndreasDeak 当然不是。
  • 这里我只能猜测,但可能addPage并没有真正将页面复制到new_pdf中,而只是对原始文件的引用,然后在@987654329末尾关闭该文件@.
  • @tobias_k 当create_copy 设置为False 时,我修改了在r+b 中打开文件的方法。这样我就可以简单地将fin 作为参数传递给new_pdf.write()。这行得通,所以我怀疑你是对的。想从您的评论中得到答案?

标签: python python-3.x file-io with-statement pypdf2


【解决方案1】:

这是一种疯狂的猜测,因为我不熟悉该模块,也没有打扰read the source code

但是,从文档来看,PdfFileWriter.addPage 似乎需要一个 PageObject,它引用了页面所属的 PDF 文件。所以我的猜测是addPage 不会立即创建副本,而只是对原始 PDF 中页面的引用,并且当在写入新 PDF 之前关闭该文件时,该页面的内容就会丢失。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-15
    • 2021-08-29
    • 2018-12-06
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多