2010-12-12 22 views
6

這應該是很簡單的問題,對此我無法通過谷歌搜索找到答案:如何關閉文件句柄pyPDF打開「PdfFileReader」類如何關閉pyPDF「PdfFileReader」類文件處理

這裏片段:

import os.path 
from pyPdf import PdfFileReader 

fname = 'my.pdf' 
input = PdfFileReader(file(fname, "rb")) 

os.rename(fname, 'my_renamed.pdf') 

這引起了錯誤[32]

感謝

+0

你在重命名之前是否運行windows並且存在'my_renamed.pdf'? – khachik 2010-12-12 15:13:12

+0

是的,我忘了提及我運行Windows 7 32位並使用Python 2.5。文件'my_renamed.pdf'不存在 – romor 2010-12-12 15:14:13

+0

@romor'32'表示由於正在使用而無法訪問文件。嘗試手動關閉'fname'(讀取完畢後),然後重命名。 – khachik 2010-12-12 15:18:38

回答

4

操作系統是防止被重新命名,而別的東西有它一個文件打開。這是一件好事(tm)。

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及以上的有默認啓用。

3

如果你真的必須從PdfFileReader對象(即:如果你還沒有得到該文件對象的引用自己)上網本,您可以使用reader.stream.close()

注意,PdfFileReader需要一個打開的文件對象來訪問pdf的內容(它不會從一開始就將所有內容拉到內存中),因此只有在完成閱讀器時才關閉文件。

1

我會sugest處理文件打開了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') 
0

而是採用input=PdfFileReader(file(fname, "rb")) 創建這樣

inputStream=file(fname, "rb") 
    input=PdfFileReader(inputStream) 

的輸入流和當工作完成時使用inputStream.close() 然後你就可以通過os包來調用它