我尝试重命名以pdfquery开头的pdf文件,并从数据中提取pdf文件的名称。 pdfquery锁定文件并防止重命名。没有关闭文件的解锁方法。
我试图'del pdf'并强制在重命名之前关闭文件,但是它不起作用。 (在Windows上尝试过,不知道linux是否可以工作)
import os
import pdfquery
def is_pdf(file):
if os.path.splitext(file.lower())[1] == '.pdf':
return True
pdf_files = os.listdir('./pages')
for pdf_file in filter(is_pdf, pdf_files):
if is_pdf(pdf_file):
print(pdf_file)
pdf = pdfquery.PDFQuery(os.path.join('pages', pdf_file))
pdf.load()
for e in pdf.tree.iter():
text = e.text
if text:
text = text.replace(' ', '')
if text[0:7] == '4002629':
#del pdf
os.rename(os.path.join('pages', pdf_file), '{}.pdf'.format(text))
期望重命名的文件,但得到:
Traceback (most recent call last):
File "C:\Users\Administrator\Desktop\PDFs_aufbereiten\pdf_pages_rename.py", line 22, in <module>
os.rename(os.path.join('pages', pdf_file), '{}.pdf'.format(text))
PermissionError: [WinError 32] Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird: 'pages\\xxxxxxxxxxxxxxxxxxxx.pdf' -> 'xxxxxxxxxxxxx.pdf'
答案 0 :(得分:0)
该代码在Linux上有效,因此pdfquery或pdfquery使用的模块仅在Windows上引起错误。我在https://github.com/jcushman/pdfquery/issues/75上发布了一个问题,并在得到修复或解决方法后更新了此帖子。
解决方法,在使用pdfquery.PDFQuery之前通过自己的代码打开/关闭文件(感谢nedbat):
import os
import pdfquery
def is_pdf(file):
if os.path.splitext(file.lower())[1] == '.pdf':
return True
rename_files = []
pdf_files = os.listdir('./pages')
for pdf_file in filter(is_pdf, pdf_files):
print(pdf_file)
with open(os.path.join('pages', pdf_file), 'rb') as myfile:
pdf = pdfquery.PDFQuery(myfile)
pdf.load()
for e in pdf.tree.iter():
text = e.text
if text:
text = text.replace(' ', '')
if text[0:7] == '4002629':
rename_files.append(
(pdf_file, '{}.pdf'.format(text))
)
break
for oldname, newname in rename_files:
os.rename(os.path.join('pages', oldname),
os.path.join('pages', newname)
)
答案 1 :(得分:0)
这也应该起作用:
pdf.file.close()