我正在尝试通过使用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)
答案 0 :(得分:0)
您没有关闭pdf阅读器使用的输入流(文件)。 因此,当您尝试重命名文件时,它仍处于打开状态。
所以,而不是:
input = PdfFileReader(file(filepath, "rb"))
试试这个:
inputStream = file(filepath, "rb")
input = PdfFileReader(inputStream)
(... when done with this file...)
inputStream.close()
答案 1 :(得分:0)
看起来您不会关闭与PDF阅读器对象关联的文件对象。虽然可能在函数结束时它会自动关闭,但是为了确保您可能想要创建一个单独的文件对象,您将其传递给PdfFileReader,然后在完成后关闭文件句柄。然后重命名。
以下内容来自SO:How to close pyPDF "PdfFileReader" Class file handle import os.path 来自pyPdf import PdfFileReader
fname = 'my.pdf'
fh = file(fname, "rb")
input = PdfFileReader(fh)
fh.close()
os.rename(fname, 'my_renamed.pdf')
答案 2 :(得分:0)
考虑使用Python的with
指令。有了它,您无需自己处理文件:
def getName(filepath):
output = PdfFileWriter()
with file(filepath, "rb") as pdfFile:
input = PdfFileReader(pdfFile)
...