Очистка PDF-файлов: проблема с получением всех строк из таблиц – Python ⇐ Python
-
Anonymous
Очистка PDF-файлов: проблема с получением всех строк из таблиц – Python
У меня возникли серьезные проблемы с парсингом PDF-файлов. Я пытаюсь извлечь информацию, представленную в формате таблицы, из этого PDF-файла, со страниц с 4 по 605. Действительно, структура извлеченного из него .txt непостоянна, что усложняет процесс. Например, иногда некоторые значения обрезаются до «15,00», «1500» или «1 50 0» и т. д., и я не могу восстановить всю таблицу.
Вот что я пробовал:
[*]
Сначала я извлекаю информацию PDF в файл .txt.
Вот код:
#!/usr/bin/python3 из PyPDF2 импортировать PdfReader pdf_document = input("файл:") имя_файла = pdf_document.split('.') text_file = f'prices_cars_2015_data.txt' с open(pdf_document, "rb") в качестве pdf_read, open(text_file, mode='w',coding='UTF-8') в качестве вывода: PDF = PdfReader(pdf_read) num_of_pages = len(pdf.pages) print(f"Необходимо обработать {num_of_pages} страниц.") Распечатать() print("Работаю...") для page_number в диапазоне (num_of_pages): страница = pdf.pages[номер_страницы] print(f"Страница: {page_number+1}", file=output) печать('', файл=выход) печать (page.extract_text (), файл = вывод) печать('', файл=выход) печать("Готово"). [*]Затем я преобразовываю TXT в файл CSV (потому что мне нужен окончательный файл .xlsx для дальнейшего использования в R или Stata).
Вот код:
#!/usr/bin/python3 # -*- кодировка: utf-8 --*- из импорта os.path существует, getmtime, Splitext импортировать повторно импортировать CSV text_path = "prices_cars_2015_data.txt" # Скрипт помещает несовпадающий текст в другой файл. Если этот файл существует и новее # чем исходный текстовый файл, вместо этого он будет проанализирован, и соответствующий вывод будет # добавлен в файл CSV. unmatched_path = "%s unmatched%s" % Splitext(text_path) csv_path = Splitext(text_path)[0] + ".csv" если существует (unmatched_path) и getmtime (unmatched_path) > getmtime (text_path): # Не первый раз. Работа с несовпадающим файлом. входной_путь = несовпадающий_путь csv_mode = "а" еще: # Первый раз. Работа с текстовым файлом. путь_ввода = путь_текста csv_mode = "ш" с open(input_path,coding="UTF-8") в качестве входного_файла: текст = входной_файл.читать() fieldnames = ["MARCA", "MODELO-TIPO", "PERIODO COMERCIAL", "CC", "Nº de cilind.", "G/D", "P кВт", "cvf", "CO2 гр/км" , "резюме", "VALOR EUROS"] # Столбцы разделены 1 пробелом. узор = ( # МАРКА r"(?P[A-Z]+(?: [A-Z]+)?)" # (разделитель) " " # МОДЕЛЬ-ТИПО r"(?P.+?)" # (разделитель) " " # ПЕРИОД КОММЕРЧЕСКОГО СРЕДСТВА (год окончания не является обязательным) r"(?P(?:\d{4}-(?:\d{4})?)?)" # (разделитель) " " # К.К. r"(?P\d+)" # (разделитель) " " # Число цилиндров. r"(?P\d+)" # (разделитель) " " # Г/Д r"(?P(?:[GDMS]|GyE|DyE|Elc)?)" # (разделитель) " " # P кВт (одно значение или диапазон) r"(?P\d+(?:-\d+)?)" # (разделитель) " " # cvf r"(?P\d+ ?,\d+)" # (разделитель) " " # CO2 г/км (может быть пустым) r"(?P(?:\d*)?)" # (разделитель) " " # резюме r"(?P\d+)" # (разделитель) " " # ЕВРО ДОБЕЛОСТИ r"(?P\d+)" ) непревзойденный = [] с open(csv_path, csv_mode, newline="",coding="UTF-8") как csv_file: писатель = csv.DictWriter(csv_file, fieldnames=fieldnames) если csv_mode == "w": # Запишите строку заголовка только в первый раз. писатель.writeheader() cur_pos = 0 для м в re.finditer(шаблон, текст): # Скопируйте несовпадающий текст. unmatched.append(текст[cur_pos: m.start()]) cur_pos = m.end() строка = [ м["марка"], " ".join(m["modelo"].split()), m["период"].replace(" ", ""), m["cc"].replace(" ", ""), м["цилиндр"], м["гд"], м["пкв"], m["cvf"].replace(" ", ""), м["co2"], м["резюме"], м["доблесть"], ] writer.writerow(dict(zip(имена полей, строка))) unmatched.append(текст[cur_pos: ]) несопоставленный = "\n".join(несопоставленный) несопоставленный = re.sub(r"\n{3,}", r"\n\n", несопоставленный) с open(unmatched_path, "w",coding="UTF-8") как unmatched_file: unmatched_file.write(непревзойденный) Может ли кто-нибудь предложить мне лучшее решение этой проблемы, если таковое имеется? Большое спасибо за вашу помощь.
У меня возникли серьезные проблемы с парсингом PDF-файлов. Я пытаюсь извлечь информацию, представленную в формате таблицы, из этого PDF-файла, со страниц с 4 по 605. Действительно, структура извлеченного из него .txt непостоянна, что усложняет процесс. Например, иногда некоторые значения обрезаются до «15,00», «1500» или «1 50 0» и т. д., и я не могу восстановить всю таблицу.
Вот что я пробовал:
[*]
Сначала я извлекаю информацию PDF в файл .txt.
Вот код:
#!/usr/bin/python3 из PyPDF2 импортировать PdfReader pdf_document = input("файл:") имя_файла = pdf_document.split('.') text_file = f'prices_cars_2015_data.txt' с open(pdf_document, "rb") в качестве pdf_read, open(text_file, mode='w',coding='UTF-8') в качестве вывода: PDF = PdfReader(pdf_read) num_of_pages = len(pdf.pages) print(f"Необходимо обработать {num_of_pages} страниц.") Распечатать() print("Работаю...") для page_number в диапазоне (num_of_pages): страница = pdf.pages[номер_страницы] print(f"Страница: {page_number+1}", file=output) печать('', файл=выход) печать (page.extract_text (), файл = вывод) печать('', файл=выход) печать("Готово"). [*]Затем я преобразовываю TXT в файл CSV (потому что мне нужен окончательный файл .xlsx для дальнейшего использования в R или Stata).
Вот код:
#!/usr/bin/python3 # -*- кодировка: utf-8 --*- из импорта os.path существует, getmtime, Splitext импортировать повторно импортировать CSV text_path = "prices_cars_2015_data.txt" # Скрипт помещает несовпадающий текст в другой файл. Если этот файл существует и новее # чем исходный текстовый файл, вместо этого он будет проанализирован, и соответствующий вывод будет # добавлен в файл CSV. unmatched_path = "%s unmatched%s" % Splitext(text_path) csv_path = Splitext(text_path)[0] + ".csv" если существует (unmatched_path) и getmtime (unmatched_path) > getmtime (text_path): # Не первый раз. Работа с несовпадающим файлом. входной_путь = несовпадающий_путь csv_mode = "а" еще: # Первый раз. Работа с текстовым файлом. путь_ввода = путь_текста csv_mode = "ш" с open(input_path,coding="UTF-8") в качестве входного_файла: текст = входной_файл.читать() fieldnames = ["MARCA", "MODELO-TIPO", "PERIODO COMERCIAL", "CC", "Nº de cilind.", "G/D", "P кВт", "cvf", "CO2 гр/км" , "резюме", "VALOR EUROS"] # Столбцы разделены 1 пробелом. узор = ( # МАРКА r"(?P[A-Z]+(?: [A-Z]+)?)" # (разделитель) " " # МОДЕЛЬ-ТИПО r"(?P.+?)" # (разделитель) " " # ПЕРИОД КОММЕРЧЕСКОГО СРЕДСТВА (год окончания не является обязательным) r"(?P(?:\d{4}-(?:\d{4})?)?)" # (разделитель) " " # К.К. r"(?P\d+)" # (разделитель) " " # Число цилиндров. r"(?P\d+)" # (разделитель) " " # Г/Д r"(?P(?:[GDMS]|GyE|DyE|Elc)?)" # (разделитель) " " # P кВт (одно значение или диапазон) r"(?P\d+(?:-\d+)?)" # (разделитель) " " # cvf r"(?P\d+ ?,\d+)" # (разделитель) " " # CO2 г/км (может быть пустым) r"(?P(?:\d*)?)" # (разделитель) " " # резюме r"(?P\d+)" # (разделитель) " " # ЕВРО ДОБЕЛОСТИ r"(?P\d+)" ) непревзойденный = [] с open(csv_path, csv_mode, newline="",coding="UTF-8") как csv_file: писатель = csv.DictWriter(csv_file, fieldnames=fieldnames) если csv_mode == "w": # Запишите строку заголовка только в первый раз. писатель.writeheader() cur_pos = 0 для м в re.finditer(шаблон, текст): # Скопируйте несовпадающий текст. unmatched.append(текст[cur_pos: m.start()]) cur_pos = m.end() строка = [ м["марка"], " ".join(m["modelo"].split()), m["период"].replace(" ", ""), m["cc"].replace(" ", ""), м["цилиндр"], м["гд"], м["пкв"], m["cvf"].replace(" ", ""), м["co2"], м["резюме"], м["доблесть"], ] writer.writerow(dict(zip(имена полей, строка))) unmatched.append(текст[cur_pos: ]) несопоставленный = "\n".join(несопоставленный) несопоставленный = re.sub(r"\n{3,}", r"\n\n", несопоставленный) с open(unmatched_path, "w",coding="UTF-8") как unmatched_file: unmatched_file.write(непревзойденный) Может ли кто-нибудь предложить мне лучшее решение этой проблемы, если таковое имеется? Большое спасибо за вашу помощь.