如何覆盖正在被Python读取的文件

3 投票
3 回答
3583 浏览
提问于 2025-04-15 22:13

我不太确定怎么表达这个问题,但我想做的是读取一个PDF文件,进行一些修改,然后把修改后的PDF保存到原来的文件上。目前,我可以把修改后的PDF保存到一个新的文件里,但我想要的是替换掉原来的文件,而不是创建一个新文件。

这是我现在的代码:

from pyPdf import PdfFileWriter, PdfFileReader

output = PdfFileWriter()
input = PdfFileReader(file('input.pdf', 'rb'))
blank = PdfFileReader(file('C:\\BLANK.pdf', 'rb'))

# Copy the input pdf to the output.
for page in range(int(input.getNumPages())):
    output.addPage(input.getPage(page))

# Add a blank page if needed.
if (input.getNumPages() % 2 != 0):
    output.addPage(blank.getPage(0))

# Write the output to pdf.
outputStream = file('input.pdf', 'wb')
output.write(outputStream)
outputStream.close()

如果我把outputStream改成一个不同的文件名,那就没问题了。但我就是不能覆盖原来的文件,因为它还在使用中。我尝试过用.close()来关闭这个流,但也出现了错误。

我觉得这个问题应该有一个比较简单的解决办法,只是我一直没找到。

谢谢!

3 个回答

1

如果你的PDF文件不大(这要看你使用的设备),你可以把整个文件读进来,关闭文件,修改里面的数据,然后再把修改后的内容写回到同一个文件里。

8

你可以随时把临时输出的文件改名为旧文件的名字:

import os
f = open('input.pdf', 'rb')
# do stuff to temp.pdf
f.close()
os.rename('temp.pdf', 'input.pdf')
3

你说你尝试关闭这个流,但出现了错误?你可以先删除 PdfFileReader 对象,这样就确保没有人还能访问这个流。然后再关闭这个流。

from pyPdf import PdfFileWriter, PdfFileReader

inputStream = file('input.pdf', 'rb')
blankStream = file('C:\\BLANK.pdf', 'rb')
output = PdfFileWriter()
input = PdfFileReader(inputStream)
blank = PdfFileReader(blankStream)

...

del input # PdfFileReader won't mess with the stream anymore
inputStream.close()
del blank
blankStream.close()

# Write the output to pdf.
outputStream = file('input.pdf', 'wb')
output.write(outputStream)
outputStream.close()

撰写回答