2013-11-14 49 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) 
     ...