3

我正在尝试用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: [Error 32] The process cannot access the file because it is being used by another process: 'C:/originalFile.pdf'

谁能解释我将文件添加到合并文件后如何关闭文件?

4

5 回答 5

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自动关闭文件。

于 2013-09-27T04:21:30.403 回答
2

要关闭文件,您应该使用with语句打开它,无论块内的代码发生什么,它总是关闭文件with

with open(originalFile,'rb') as pdf:
    merger.append(PdfFileReader(pdf))
os.remove(originalFile)

这对我有用。

提醒一下,您可以关闭文件,因为您已将 pdf 添加到merger. 请注意,如果您只是打开它PdfFileReader(pdf)而没有对其进行任何操作,则无法删除该文件,否则该PdfFileReader对象将无法读取该文件。这是因为PdfFileReader如果您在文件上调用一些读取方法,则只有实际读取文件getPage

于 2013-09-27T04:24:40.213 回答
0

成为原始文件已打开,因此,在关闭文件之前,您无法删除该文件。您需要像这样修改您的代码:

merger = PdfFileMerger()
fin = file(originalFile, 'rb')
merger.append(PdfFileReader(fin))
fin.close()
os.remove(originalFile)
于 2013-09-27T04:37:51.440 回答
0

PyPDF 合并现在在版本 1.26.0 中具有关闭方法

关闭()

关闭所有文件描述符(输入和输出)并清除所有内存使用。

https://pythonhosted.org/PyPDF2/PdfFileMerger.html

于 2019-12-04T19:09:07.483 回答
-2

Pdf合并在python中并不难。我看到您已经在使用 PdfFileMerger。只要 pdf 文件存在,并且派生 python 进程的用户有权访问正在合并的 pdf,这应该可以工作。祝你好运。

于 2013-09-27T05:37:43.870 回答