我正在尝试在python中编写一个带有PDF文件的程序,并首先将任何包含其果实名称(芒果,橙或苹果)的pdf附加到其上,然后在pdf中附加名称为动物到原始文件(斑马,猴子,狗),最后附加任何剩余的PDF文件。这是我的代码:
import os
from PyPDF2 import PdfFileReader, PdfFileMerger
originalFile="C:/originalFile.pdf"
merger = PdfFileMerger()
merger.append(PdfFileReader(file(originalFile, 'rb')))
os.remove(originalFile)
for filename in os.listdir('C:/'):
if "Mango" in filename or "Apple" in filename or "Orange" in filename:
if ".pdf" in filename:
merger.append(PdfFileReader(file('C:/'+filename, 'rb')))
os.remove("C:/"+filename)
for filename in os.listdir('C:/'):
if "Zebra" in filename or "Monkey" in filename or "Dog" in filename:
if ".pdf" in filename:
merger.append(PdfFileReader(file('C:/'+filename, 'rb')))
os.remove("C:/"+filename)
for filename in os.listdir('C:/'):
if ".pdf" in filename:
merger.append(PdfFileReader(file('C:/TRIAL/'+filename, 'rb')))
os.remove("C:/TRIAL/"+filename)
merger.write(originalFile)
当我运行此程序时,我收到以下错误:
os.remove(originalFile) WindowsError:[错误32]进程无法访问该文件,因为它正由另一个进程使用:'C:/originalFile.pdf'
在我将文件添加到合并文件后,有人能解释我如何关闭文件吗?
答案 0 :(得分:2)
您应该明确关闭文件。
fd = file('C:/'+filename, 'rb')
merger.append(PdfFileReader(fd))
fd.close()
os.remove('C:/'+filename)
更安全的版本:
fd = None
try:
fd = file('C:/'+filename, 'rb')
merger.append(PdfFileReader(fd))
finally:
if fd: fd.close()
if os.path.exists('C:/'+filename): os.remove('C:/'+filename)
可以在Python 2.5+中简化为:
with file('C:/'+filename, 'rb') as fd:
merger.append(PdfFileReader(fd))
if os.path.exists('C:/'+filename): os.remove('C:/'+filename)
这会导致python自动关闭文件。
答案 1 :(得分:2)
要关闭文件,您应该使用with
语句打开它,该语句始终关闭with
块内代码发生的任何文件:
with open(originalFile,'rb') as pdf:
merger.append(PdfFileReader(pdf))
os.remove(originalFile)
这适合我。
提醒您,您可以关闭该文件,因为您已将pdf添加到merger
。请注意,如果您只是使用PdfFileReader(pdf)
打开它并且没有对其执行任何操作,则无法删除该文件,或者PdfFileReader
对象将无法读取该文件。这是因为如果你在PdfFileReader
上调用一些读取方法,getPage
实际上只读取文件
答案 2 :(得分:0)
成为originalFile已打开,因此,在关闭文件之前无法删除该文件。 您需要像这样修改代码:
merger = PdfFileMerger()
fin = file(originalFile, 'rb')
merger.append(PdfFileReader(fin))
fin.close()
os.remove(originalFile)
答案 3 :(得分:0)
PyPDF合并现在从1.26.0版本开始具有关闭方法
关闭()
关闭所有文件描述符(输入和输出)并清除所有内存使用情况。
答案 4 :(得分:-1)
Pdf合并在python中并不那么难。我看到你已经在使用PdfFileMerger了。只要pdf文件存在,这应该有效,并且分叉python进程的用户有权访问正在合并的pdf。祝你好运。