Python PyPDF2查找关闭的文件错误

Python PyPDF2查找关闭的文件错误,python,python-3.x,pypdf,pypdf2,Python,Python 3.x,Pypdf,Pypdf2,我正在制作一个pdf拆分器,起初似乎工作得很好。但是,当我尝试使用多个页面区域时,我不断得到以下错误-->ValueError:seek of closed file。 如果省略pdf_file.close(),错误将停止,但创建的所有pdf将没有页面。 我的代码在这里: from PyPDF2 import PdfFileReader , PdfFileWriter counter = 1 pdf_file = open(fileName2,'rb') pdf_reader = PdfFil

我正在制作一个pdf拆分器,起初似乎工作得很好。但是,当我尝试使用多个页面区域时,我不断得到以下错误-->ValueError:seek of closed file。 如果省略pdf_file.close(),错误将停止,但创建的所有pdf将没有页面。 我的代码在这里:

from PyPDF2 import PdfFileReader , PdfFileWriter

counter = 1
pdf_file = open(fileName2,'rb')
pdf_reader = PdfFileReader(pdf_file)
pdf_writer = PdfFileWriter()
output_file2 , _ = QtWidgets.QFileDialog.getSaveFileName(self, "Save file", fileName2_c2+"_splited", "Folder will be created")
os.makedirs(r'{}'.format(output_file2+"\\{}_splited".format(fileName2_c2)))

for z in list_pdf_split:
    try:
        pdf_file = open(fileName2,'rb')
    except:
        print("error")
    print(z)
    c_z = z.split("-")

    for i in range(int(c_z[0]),int(c_z[1])+1):
        print(i)


        pdf_writer.addPage(pdf_reader.getPage(i-1))


    output_file = open(output_file2+"\\{}_splited".format(fileName2_c2)+"{}".format(counter)+".pdf",'wb')


    pdf_reader = PdfFileReader(pdf_file)
    pdf_writer = PdfFileWriter()
    pdf_writer.write(output_file)
    output_file.close()
    counter +=1
    pdf_file.close() 

对不起,我想我回答这个问题太快了。
我将pdf.writer和pdf.reader移到for循环的开头,因为它似乎阻止了代码(用于编写pdf的流)。

您的逻辑在多个地方没有多大意义


首先,你要问的问题。看看你如何处理
pdf\u文件
pdf\u阅读器

  • pdf\u文件的形式打开文件
  • 创建一个
    PdfFileReader
    附加到
    pdf\u文件
    作为
    pdf\u阅读器
  • 重新打开与pdf文件相同的文件。这会释放旧文件,使其成为垃圾,因此很快(通常是立即)就会关闭
  • pdf\u reader
    上反复调用
    getPage(:-1)
    ,这可能是第一次附加到一个关闭的文件,而且以后每次都是如此
  • 用我们在步骤3中打开的文件创建一个新的
    PdfFileReader
    ,作为
    pdf\u reader
  • 关闭刚刚打开的
    pdf\u文件
    ,因此
    pdf\u阅读器
    现在肯定正在引用一个已关闭的文件
  • 重复步骤2-6
  • 您需要在步骤3之前或步骤5之后执行步骤4,或者需要有两个不同的
    pdf\u文件
    变量,以便在仍然使用旧变量的情况下打开新变量。我不确定你想要这三个文件中的哪一个,但实际上,你是从一个关闭的文件中读取的

    但我认为,将事情重新组织起来以消除步骤1会更简单,而不是在循环之前打开东西,然后在每个循环结束时重新打开东西,你只需要在循环开始时打开东西,就在你需要的地方


    其次,你的作者也同样困惑。看看您如何使用
    输出文件
    pdf\u编写器

  • 创建
    PdfFileWriter
    as
    pdf\u writer
  • 重复添加页面
  • output\u file
    的形式打开输出文件
  • 创建一个新的
    PdfFileWriter
    作为
    pdf\u writer
    ,丢弃您写入旧文件的所有内容
  • 将现在为空的
    pdf\u writer
    写入
    输出文件
  • 重复步骤2-5

  • 同样,您需要在其他地方执行步骤5,可能在步骤4之前。但是,再次强调,重新组织内容以消除步骤1可能要简单得多。

    Thx为了寻求帮助,我已经找到了答案,但这是一个大程序的一部分,循环是因为我要求用户输入多个范围,以便创建、合并等不同范围的页面。