Как закрыть файл, открытый с помощью pdfquery, он блокирует pdf-файл? - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь переименовать pdf-файлы, открытые с помощью pdfquery, извлекая из файла имя pdf-файла.pdfquery блокирует файл и предотвращает переименование.Не существует метода close для разблокировки файла.

Я попытался «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'

1 Ответ

0 голосов
/ 10 мая 2019

Код работает на 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)
              )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...