多页PDF表格提取不全求助:仅获取2页及页眉数据
多页PDF表格提取异常:仅获取2页数据
尝试提取多页PDF中的表格,但目前仅能获取2页数据及页眉信息。已将源PDF、输出CSV文件、代码文本文件整理,输出结果已存入CSV文件,目标是读取PDF中的全部数据。
当前使用的代码
import tabula import requests import csv import pandas as pd import re import parse import pdfplumber from collections import namedtuple import datetime from datetime import date import os import glob import shutil from os import path # 使用pdfplumber提取港口名称、品级名称和报告月份,用于后续数据拼接 # ------------------------------------文件名 file = "C:\\Users\\xxx\\Downloads\\test.pdf" lines = [] pnames = [] gnames = [] mreports = [] with pdfplumber.open(file) as pdf: for page in pdf.pages: try: text = page.extract_text() except: text = '' if text is not None: liness = text.split('\n') lines += liness for li in lines: if "Port:" in li: li = li.replace("Port:", "").strip() li_new = li.split("Month Reporting:")[-0].strip() m_repor = li.split("Month Reporting:")[-1].strip() if "Grade Name:" in li_new: g_name = li_new.split("Grade Name:")[-1].strip() p_name = li_new.split("Grade Name:")[0].strip() print(li_new) else: g_name = li_new.split()[1:] g_name = ' '.join(g_name).strip() p_name = li_new.split()[0].strip() pnames.append(p_name) gnames.append(g_name) mreports.append(m_repor) print("PortName: ", len(pnames)) print("GradeName: ", len(gnames)) print("MonthReporting: ", len(mreports)) # 使用tabula提取PDF中所有表格并清洗,用于最终拼接 df = tabula.read_pdf(file, pages='all') final_list = [ ["PORT NAME", "GRADE NAME", "MONTH REPORTING", "BL DATE", "VESSEL", "DESTINATION", "CHARTERERS", "API"]] # final_list=[] print(final_list) last_df = len(df) print("Length of tables: ", last_df) for i in range(0, len(pnames)): op_df = df[i] op_df = op_df.dropna(how='all') op_df_list = op_df.values.tolist() for li in op_df_list: if str(li[0]) == "nan": li = li[1:] else: print("check this case") print(li) li.insert(0, pnames[i]) li.insert(1, gnames[i]) li.insert(2, mreports[i]) print(li) if "BL Date" in li: pass else: final_list.append(li) df_2 = pd.DataFrame(final_list) df_2.columns = df_2.iloc[0] df_2 = df_2[1:] max_row=len(df_2) curr_date = datetime.datetime.now() created_date = curr_date.strftime('%d-%b-%y') for row in range(max_row): df_2['created_by'] = 'created by' df_2['created_date'] = created_date print(df_2) df_2.rename( columns={'PORT NAME': 'port_name', 'GRADE NAME': 'crude', 'MONTH REPORTING': 'reporting_month', 'BL DATE': 'bl_date', 'VESSEL': 'vessel', 'DESTINATION': 'destination', 'CHARTERERS': 'charterer', 'API': 'api'}, inplace=True) df_2 = df_2.reindex( columns=["port_name", "crude", "reporting_month", "bl_date", "vessel", "destination", "Charterer", "api"]) # return df_2 df_2.to_csv('Outputfile.csv', index=False) print("Sucessfully generated output CSV")
尝试过的其他代码(无法适配现有逻辑)
import pdfplumber import pandas as pd pdf_file = "test.pdf" with pdfplumber.open(pdf_file) as pdf: lst = [p.extract_table() for p in pdf.pages] flat_list = [item for sublist in lst[:3] for item in sublist] df = pd.DataFrame(flat_list) df.columns = df.iloc[0] df = df[1:]
内容的提问来源于stack exchange,提问作者Shree S
相关产品推荐
相关产品推荐

