0

我正在尝试通过使用 PyPdf 从文件中提取名称来重命名 pdf 文件列表。我尝试使用 for 循环重命名文件,但我总是收到代码 32 的错误,表明该文件正在被另一个进程使用。我正在使用 python2.7 这是我的代码

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)
4

3 回答 3

1

考虑使用withPython 的指令。有了它,您无需自己处理关闭文件:

def getName(filepath):
    output = PdfFileWriter()
    with file(filepath, "rb") as pdfFile:
        input = PdfFileReader(pdfFile)
        ...
于 2013-11-14T13:06:16.700 回答
0

您似乎没有关闭与 PDF 阅读器对象关联的文件对象。虽然可能在函数结束时它会自动关闭,但要确保您可能想要创建一个单独的文件对象,然后将其传递给 PdfFileReader,然后在完成后关闭文件句柄。然后重命名。

以下来自SO:如何关闭pyPDF“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')
于 2013-11-14T12:48:31.227 回答
0

您没有关闭 pdf 阅读器使用的输入流(文件)。因此,当您尝试重命名文件时,它仍然处于打开状态。

所以,而不是这个:

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

尝试这个:

inputStream = file(filepath, "rb")
input = PdfFileReader(inputStream)
(... when done with this file...)
inputStream.close()
于 2013-11-14T12:46:08.927 回答