Python PyPDF2 查找已关闭文件错误
Python PyPDF2 seek of closed file Error
我正在制作一个 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_file
和 pdf_reader
:
做了什么
- 以
pdf_file
. 打开文件
- 创建附加到
pdf_file
的 PdfFileReader
作为 pdf_reader
。
- 重新打开与
pdf_file
相同的文件。这会释放旧文件,使其成为垃圾,因此很快(通常是立即)关闭。
- 在
pdf_reader
上重复调用 getPage(:-1)
,这可能是第一次附加到已关闭的文件,之后肯定每次都是。
- 使用我们在第 3 步中打开的文件创建一个新的
PdfFileReader
,如 pdf_reader
。
- 关闭您刚刚打开的
pdf_file
,因此 pdf_reader
现在肯定引用了一个已关闭的文件。
- 重复步骤 2-6。
您需要在第 3 步之前或第 5 步之后执行第 4 步,或者您需要有两个不同的 pdf_file
变量,以便您可以打开新变量,同时仍然使用旧变量。我不确定你想要这三个中的哪一个,但实际上,你正在从一个关闭的文件中读取。
但我认为重组事物以消除步骤 1 会更简单 — 与其尝试在循环之前打开事物然后在每个循环结束时重新打开事物,不如在循环开始时打开事物, 就在你需要的地方。
其次,您的作者也同样困惑。看看你用 output_file
和 pdf_writer
:
做了什么
- 将
PdfFileWriter
创建为 pdf_writer
。
- 重复添加页面。
- 将输出文件打开为
output_file
。
- 创建一个新的
PdfFileWriter
作为 pdf_writer
,丢弃您写入旧的所有内容。
- 写出现在空的
pdf_writer
到 output_file
。
- 重复步骤 2-5。
同样,您需要在其他地方执行第 5 步,可能在第 4 步之前。但是,重新组织以消除第 1 步可能要简单得多。
我正在制作一个 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_file
和 pdf_reader
:
- 以
pdf_file
. 打开文件
- 创建附加到
pdf_file
的PdfFileReader
作为pdf_reader
。 - 重新打开与
pdf_file
相同的文件。这会释放旧文件,使其成为垃圾,因此很快(通常是立即)关闭。 - 在
pdf_reader
上重复调用getPage(:-1)
,这可能是第一次附加到已关闭的文件,之后肯定每次都是。 - 使用我们在第 3 步中打开的文件创建一个新的
PdfFileReader
,如pdf_reader
。 - 关闭您刚刚打开的
pdf_file
,因此pdf_reader
现在肯定引用了一个已关闭的文件。 - 重复步骤 2-6。
您需要在第 3 步之前或第 5 步之后执行第 4 步,或者您需要有两个不同的 pdf_file
变量,以便您可以打开新变量,同时仍然使用旧变量。我不确定你想要这三个中的哪一个,但实际上,你正在从一个关闭的文件中读取。
但我认为重组事物以消除步骤 1 会更简单 — 与其尝试在循环之前打开事物然后在每个循环结束时重新打开事物,不如在循环开始时打开事物, 就在你需要的地方。
其次,您的作者也同样困惑。看看你用 output_file
和 pdf_writer
:
- 将
PdfFileWriter
创建为pdf_writer
。 - 重复添加页面。
- 将输出文件打开为
output_file
。 - 创建一个新的
PdfFileWriter
作为pdf_writer
,丢弃您写入旧的所有内容。 - 写出现在空的
pdf_writer
到output_file
。 - 重复步骤 2-5。
同样,您需要在其他地方执行第 5 步,可能在第 4 步之前。但是,重新组织以消除第 1 步可能要简单得多。