Возникли проблемы при реализации, попробуйте, кроме как в PDFminer - PullRequest
0 голосов
/ 01 мая 2019

У меня есть скрипт, который запускает весь каталог и извлекает каждый PDF-файл, извлекает текст и находит ключевые слова в каждом PDF-файле. Кажется, что он отлично работает с несколькими PDF-файлами, но всякий раз, когда он сталкивается с PDF-файлом с какой-либо проблемой, сценарий ломается.

Я реализовал блок try and кроме функции, чтобы избежать этих проблем, но, похоже, он не работает, поскольку скрипт просто работает постоянно. Я новичок во всем этом, особенно с использованием try и кроме блоков. Как исправить мой скрипт, чтобы использовать try и кроме блоков, чтобы скрипт обрабатывал только хорошие PDF и игнорировал все плохие, не нарушая сценарий?

p = Path("C:/Users/Hugo Caldeira/Desktop")
inp = r"((?<=|^)[0-9]{3}-[0-9]{2}-[0-9]{4}(?=|$))"

file_dict = {
        "name": [],
        "created": [],
        "modified":[],
        'path':[],
        'content':[],
        'keyword':[]
}

files = list(p.rglob('*pdf'))

def pdfparser(file):
    fp = open(file, 'rb')
    rsrcmgr = PDFResourceManager()
    retstr = io.StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    #Create a PDF interpreter object.
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    #Process each page contained in the document.

    for page in PDFPage.get_pages(fp):
        interpreter.process_page(page)
        data =  retstr.getvalue()

    return(data)


def pdfs(files):
        for name in files:
                while True:
                        try:
                                IP_list = (pdfparser(name))
                        except (RuntimeError, TypeError, NameError):
                                print('got error')
                        keyword = re.findall(inp,IP_list)
                        #print(ip_test)
                        file_dict['keyword'].append(keyword)
                        file_dict['name'].append(name.name[0:])
                        file_dict['created'].append(time.ctime(name.stat().st_ctime))
                        file_dict['modified'].append(time.ctime(name.stat().st_mtime))
                        file_dict['path'].append(name)
                        file_dict["content"].append(IP_list)
                        #print(file_dict)
        return(file_dict)
pdfs(files)


print(pdfparser(p))

def to_xlsx():
    df = pd.DataFrame.from_dict(file_dict)
    df.head()
    df.to_excel("pdftest.xlsx")

if __name__ == "__main__":
    to_xlsx()

1 Ответ

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

Как написано, код после вашей попытки / кроме завершится ошибкой, потому что вы ссылаетесь на имя, связанное в разделе попытки. Даже если нет, из вашего цикла пока нет выхода. Вместо этого:

for name in files:
    try:
        IP_list = (pdfparser(name))
        keyword = re.findall(inp,IP_list)
        ... # Etc, etc.
    except (RuntimeError, TypeError, NameError):
        print("Error processing {}".format(name))
...