Как закрыть дескриптор файла класса pyPDF "PdfFileReader"
Это должен быть очень простой вопрос, на который я не смог найти ответ с помощью поиска Google: Как закрыть дескриптор файла, открытый классом pPFF "PdfFileReader"
Вот фрагмент:
import os.path
from pyPdf import PdfFileReader
fname = 'my.pdf'
input = PdfFileReader(file(fname, "rb"))
os.rename(fname, 'my_renamed.pdf')
что вызывает ошибку [32]
Спасибо
4 ответа
Операционная система предотвращает переименование файла, в то время как что-то еще имеет его открытым. Это хорошая вещь (тм).
Инструкция Python with автоматически закроет файл после того, как вы закончили читать / манипулировать им.
with open(fname, "rb") as f:
input = PdfFileReader(f, "rb"))
os.rename(fname, 'my_renamed.pdf')
Если вы все еще на Python 2.5, вам придется выполнить специальный импорт:
from __future__ import with_statement
В Python 2.6 и выше по умолчанию включено с.
Если вам действительно нужно получить доступ к этому из объекта PdfFileReader (то есть: если вы сами не получили ссылку на объект файла), вы можете использовать reader.stream.close()
Обратите внимание, что PdfFileReader понадобится открытый объект файла для доступа к содержимому PDF-файла (он не загружает все в память с самого начала), поэтому закрывайте файл только тогда, когда вы закончили с программой чтения.
Я бы посоветовал обработать файл, открытый из PdfFileReader
Ваш код будет:
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