Как закрыть дескриптор файла класса 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

Другие вопросы по тегам