这应该是一个非常简单的问题,但我在谷歌搜索中找不到答案:如何关闭由pyPDF “PdfFileReader”类打开的文件句柄?
以下是代码片段:
import os.path
from pyPdf import PdfFileReader
fname = 'my.pdf'
input = PdfFileReader(file(fname, "rb"))
os.rename(fname, 'my_renamed.pdf')
这会引发一个错误 [32]
谢谢
当其他进程占用一个文件时,操作系统会阻止对该文件进行重新命名。这是一件好事。
Python的 with 语句会在你完成读取/操作文件后自动关闭它。
with open(fname, "rb") as f:
input = PdfFileReader(f, "rb")
os.rename(fname, 'my_renamed.pdf')
from __future__ import with_statement
Python 2.6及以上版本默认启用了with语句。
input = PdfFileReader(f, "rb"))
多了一个右括号。应该是input = PdfFileReader(f, "rb")
。 - Love and peace - Joe Codeswell如果你真的必须从PdfFileReader对象中访问它(也就是说:如果你没有自己的文件对象的引用),你可以使用reader.stream.close()
请注意,PdfFileReader将需要一个打开的文件对象来访问pdf的内容(它不会从一开始就将所有内容加载到内存中),因此只有在完成阅读器操作后才关闭文件。
import os.path
from pyPdf import PdfFileReader
fname = 'my.pdf'
fh = file(fname, "rb")
input = PdfFileReader(fh)
fh.close()
os.rename(fname, 'my_renamed.pdf')
不要使用 input=PdfFileReader(file(fname, "rb"))
,而是像这样创建一个输入流
inputStream=file(fname, "rb")
input=PdfFileReader(inputStream)
当任务完成后,请使用inputStream.close()
,然后您就可以通过os包调用它了
my_renamed.pdf
文件已经存在? - khachik32
表示无法访问文件,因为它正在使用中。尝试在读取完fname
后手动关闭它,然后进行重命名。 - khachik