2013-11-14 48 views
0

我想通過使用PyPdf從文件中提取名稱來重命名pdf文件的列表。我試圖使用for循環來重命名文件,但我總是得到一個錯誤代碼32,說該文件正在被另一個進程使用。我使用python2.7 這裏是我的代碼使用for循環重命名pdf文件的列表

import os, glob 
from pyPdf import PdfFileWriter, PdfFileReader 

# this function extracts the name of the file 
def getName(filepath): 
    output = PdfFileWriter() 
    input = PdfFileReader(file(filepath, "rb")) 
    output.addPage(input.getPage(0)) 
    outputStream = file(filepath + '.txt', 'w') 
    output.write(outputStream) 
    outputStream.close() 

    outText = open(filepath + '.txt', 'rb') 
    textString = outText.read() 
    outText.close() 

    nameStart = textString.find('default">') 
    nameEnd = textString.find('_SATB', nameStart) 
    nameEnd2 = textString.find('</rdf:li>', nameStart) 

    if nameStart: 
     testName = textString[nameStart+9:nameEnd] 
     if len(testName) <= 100: 
      name = testName + '.pdf' 
     else: 
      name = textString[nameStart+9:nameEnd2] + '.pdf' 
    return name 


pdfFiles = glob.glob('*.pdf') 
m = len(pdfFiles) 
for each in pdfFiles: 
    newName = getName(each) 
    os.rename(each, newName) 
+0

發佈錯誤追溯和請求的時候顯示的行數。 – Feanor

+0

好的。我會這麼做 – Parousia

+0

你在Windows上嗎?是否有人可能會對您嘗試重命名的任何文件擁有打開的文件句柄? – Alfe

回答

0

你不關閉通過PDF閱讀器使用的輸入流(文件)。 因此,當您嘗試重命名文件時,它仍處於打開狀態。

所以,與其這樣:

input = PdfFileReader(file(filepath, "rb")) 

試試這個:

inputStream = file(filepath, "rb") 
input = PdfFileReader(inputStream) 
(... when done with this file...) 
inputStream.close() 
+0

謝謝。這很好用 – Parousia

+0

我如何與其他貢獻的用戶分享這個答案? – Parousia

+0

如果你認爲答案明確(它解決了你的問題),那麼你選擇它作爲「接受的答案」。爲此,請單擊該段落左側的複選標記。如果答案有幫助但不是確定性的,你可以改爲上傳它(點擊段落左側的向上箭頭)。 – elmart

0

它看起來並不像你關閉與PDF閱讀器對象關聯的文件對象。儘管可能在函數結束時自動關閉,但要確保您可能需要創建一個單獨的文件對象,然後將其傳遞給PdfFileReader,然後在完成時關閉文件句柄。然後重命名。

下面是從SO:How to close pyPDF "PdfFileReader" Class file handle 進口os.path中 從pyPdf進口PdfFileReader

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

fh.close() 
os.rename(fname, 'my_renamed.pdf') 
0

考慮使用with指令的Python。有了它,你不需要自己處理關閉文件:

def getName(filepath): 
    output = PdfFileWriter() 
    with file(filepath, "rb") as pdfFile: 
     input = PdfFileReader(pdfFile) 
     ...