鱼C论坛

 找回密码
 立即注册
查看: 1853|回复: 11

[已解决]了解一下有关用Python提取PDF当中表格的问题

[复制链接]
发表于 2023-5-1 16:24:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 wlp1818100227 于 2023-5-1 16:26 编辑

import pdfplumber
import pandas as pd
pd.set_option("display.max_columns",None)

pdf_path = "乐清湾盐沼湿地有机碳密度及碳储量估算_陈雅慧.pdf"
pdf = pdfplumber.open(pdf_path)

def read_page(page):
    tables = page.extract_tables() # 提取当前页的表格
    for i in range(len(tables)):
        table = tables[i]
        for i in range(len(table)):
            for j in range(len(table[i])):
                table[i][j] = table[i][j].replace('\n','') # 替换换行符
        df.pd.DataFrame(table[1:], columns=table[0])
        print(df)
        df.to_csv('stu_info.csv',mode = "a", endcoding = 'utf-8',index = False)
        print(str(i) + '表格提取成功')
        print("\n")
        
pages = pdf.pages

for k in range(len(pages)):
    page = pages[k]
    print("page" + str(k) + '正在解析')
    try:
        read_page(page)
    except Exception as err:
        print(err)
        print('无表格')

pdf.close()

论文截图.png

以上是我看教程学的一段提取PDF当中表格的代码,但是这个代码在遇到双栏的PDF时就不好用了,请问大家有对于这个问题有什么解决方法吗
最佳答案
2023-5-1 16:37:42
当你需要从PDF文件中提取表格数据时,Python中有多个库可以实现此功能。其中最常用的是tabula-py和pdfplumber。下面是一个使用pdfplumber库提取PDF中表格数据的示例代码,它可以将PDF中的表格转换为DataFrame并将其保存为CSV文件。
import pdfplumber
import pandas as pd

pdf_path = "example.pdf"
pdf = pdfplumber.open(pdf_path)

def read_page(page):
    tables = page.extract_tables() # 提取当前页的表格
    for table in tables:
        for i in range(len(table)):
            for j in range(len(table[i])):
                table[i][j] = table[i][j].replace('\n','') # 替换换行符
        df = pd.DataFrame(table[1:], columns=table[0])
        print(df)
        df.to_csv('output.csv', mode='a', encoding='utf-8', index=False)
        print("表格提取成功")
        print("\n")

pages = pdf.pages

for k in range(len(pages)):
    page = pages[k]
    print("page" + str(k) + '正在解析')
    try:
        read_page(page)
    except Exception as err:
        print(err)
        print('无表格')

pdf.close()
在这个示例代码中,pdfplumber库用于打开PDF文件,extract_tables()方法用于从页面中提取表格,将表格转换为DataFrame格式,然后通过调用to_csv()方法将数据保存到CSV文件中。read_page()函数将用于处理每一页,将表格转换为DataFrame并保存到CSV文件中。

需要注意的是,在实际应用中,PDF文件的格式可能各不相同,因此在解析PDF文件时可能需要进行一些调整以确保数据正确提取。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-1 16:24:35 | 显示全部楼层

回帖奖励 +50 鱼币

本帖最后由 isdkz 于 2023-5-1 16:25 编辑

遇到双栏PDF时,pdfplumber可能无法准确识别表格。在这种情况下,我们可以尝试使用camelot库,这是一个专门用于解析表格的Python库,可以更好地处理复杂的表格布局,如双栏表格。

首先,确保已安装camelot库:
pip install camelot-py[cv]

接下来,使用camelot替换pdfplumber以解析表格。这是一个使用camelot的示例代码:
import camelot
import pandas as pd

pd.set_option("display.max_columns", None)

pdf_path = "乐清湾盐沼湿地有机碳密度及碳储量估算_陈雅慧.pdf"

def read_page(page_number):
    tables = camelot.read_pdf(pdf_path, flavor="stream", pages=str(page_number), strip_text='\n')
    for table in tables:
        df = table.df
        print(df)
        df.to_csv('stu_info.csv', mode="a", encoding='utf-8', index=False)
        print(f"{page_number}页的表格提取成功\n")

# 获取PDF页数
total_pages = camelot.utils.get_page_count(pdf_path)

# 处理每一页
for page in range(1, total_pages + 1):
    print(f"page {page} 正在解析")
    try:
        read_page(page)
    except Exception as err:
        print(err)
        print('无表格')

请注意,这里使用了 camelot.read_pdf() 函数,并将参数flavor设置为"stream",以便更好地处理双栏表格。此外,我们还使用了 strip_text 参数来删除换行符。虽然camelot可能更适合处理复杂的表格布局,但它可能不如pdfplumber灵活。因此,在解决特定问题时,请根据实际需求选择合适的库。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-1 16:36:10 | 显示全部楼层

回帖奖励 +50 鱼币

看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-1 16:37:42 | 显示全部楼层    本楼为最佳答案   
当你需要从PDF文件中提取表格数据时,Python中有多个库可以实现此功能。其中最常用的是tabula-py和pdfplumber。下面是一个使用pdfplumber库提取PDF中表格数据的示例代码,它可以将PDF中的表格转换为DataFrame并将其保存为CSV文件。
import pdfplumber
import pandas as pd

pdf_path = "example.pdf"
pdf = pdfplumber.open(pdf_path)

def read_page(page):
    tables = page.extract_tables() # 提取当前页的表格
    for table in tables:
        for i in range(len(table)):
            for j in range(len(table[i])):
                table[i][j] = table[i][j].replace('\n','') # 替换换行符
        df = pd.DataFrame(table[1:], columns=table[0])
        print(df)
        df.to_csv('output.csv', mode='a', encoding='utf-8', index=False)
        print("表格提取成功")
        print("\n")

pages = pdf.pages

for k in range(len(pages)):
    page = pages[k]
    print("page" + str(k) + '正在解析')
    try:
        read_page(page)
    except Exception as err:
        print(err)
        print('无表格')

pdf.close()
在这个示例代码中,pdfplumber库用于打开PDF文件,extract_tables()方法用于从页面中提取表格,将表格转换为DataFrame格式,然后通过调用to_csv()方法将数据保存到CSV文件中。read_page()函数将用于处理每一页,将表格转换为DataFrame并保存到CSV文件中。

需要注意的是,在实际应用中,PDF文件的格式可能各不相同,因此在解析PDF文件时可能需要进行一些调整以确保数据正确提取。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-1 16:51:38 | 显示全部楼层
isdkz 发表于 2023-5-1 16:24
遇到双栏PDF时,pdfplumber可能无法准确识别表格。在这种情况下,我们可以尝试使用camelot库,这是一个专门 ...

这段代码说Ghostscript is not installed 我用pip 安装了,但是还是显示没安装,是说得单独安装吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-1 16:54:06 | 显示全部楼层
wlp1818100227 发表于 2023-5-1 16:51
这段代码说Ghostscript is not installed 我用pip 安装了,但是还是显示没安装,是说得单独安装吗

是的,Ghostscript是一个单独的程序,需要在系统中单独安装。camelot库在后台使用Ghostscript来处理PDF文件,因此在使用camelot之前,需要确保已经安装了Ghostscript。

请根据您的操作系统安装Ghostscript:

1. 对于Windows用户:
    · 访问Ghostscript的官方下载页面:https://www.ghostscript.com/download/gsdnld.html
    · 选择适合您的系统(32位或64位)的Windows版本,并点击下载。
    · 下载完成后,运行安装程序并按照提示进行安装。
    · 最后,请确保将Ghostscript的可执行文件路径添加到系统的PATH环境变量中。

2. 对于macOS用户:
    · 如果您已经安装了Homebrew,只需在终端中运行以下命令:
      
        brew install ghostscript
        
    · 如果没有安装Homebrew,请访问Ghostscript官方下载页面下载并安装适合您的macOS系统的版本:https://www.ghostscript.com/download/gsdnld.html

3. 对于Linux用户:
    · 在终端中运行以下命令(取决于您的Linux发行版):
        · Debian/Ubuntu:
         
            sudo apt-get install ghostscript
            
        · Fedora:
         
            sudo dnf install ghostscript
            
        · CentOS/RHEL:
         
            sudo yum install ghostscript
            

安装完成后,您的系统应该可以正常使用camelot库了。如果仍然遇到问题,请确保Ghostscript的可执行文件路径已添加到系统的PATH环境变量中。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-1 16:56:59 | 显示全部楼层
鱼币呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-1 16:58:35 | 显示全部楼层
当遇到双栏的PDF时,提取表格可能会出现问题,因为每一页中的文本内容不一定按照水平顺序排列。您可以尝试通过指定table_settings参数来解决这个问题。例如,您可以设置一个表格边缘的左和右坐标,使其适应页面的宽度。下面是一个修改后的代码示例:
import pdfplumber
import pandas as pd
pd.set_option("display.max_columns",None)

pdf_path = "乐清湾盐沼湿地有机碳密度及碳储量估算_陈雅慧.pdf"
pdf = pdfplumber.open(pdf_path)

def read_page(page):
    tables = page.extract_tables(table_settings={
        'vertical_strategy': 'lines',
        'horizontal_strategy': 'text',
        'explicit_vertical_lines': [],
        'explicit_horizontal_lines': [],
        'snap_tolerance': 0.01,
        'join_tolerance': 0.1,
        'edge_min_length': 2,
        'min_words_vertical': 10,
        'min_words_horizontal': 1,
        'keep_blank_chars': False,
        'text_tolerance': 0.3,
        'text_x_tolerance': None,
        'text_y_tolerance': None,
        'intersection_tolerance': 0.5,
        'intersection_x_tolerance': None,
        'intersection_y_tolerance': None,
    }) # 添加table_setting参数进行调整
    for i in range(len(tables)):
        table = tables
        for i in range(len(table)):
            for j in range(len(table)):
                table[j] = table[j].replace('\n','') # 替换换行符
        df.pd.DataFrame(table[1:], columns=table[0])
        print(df)
        df.to_csv('stu_info.csv',mode = "a", endcoding = 'utf-8',index = False)
        print(str(i) + '表格提取成功')
        print("\n")
        
pages = pdf.pages

for k in range(len(pages)):
    page = pages[k]
    print("page" + str(k) + '正在解析')
    try:
        read_page(page)
    except Exception as
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-1 16:59:51 | 显示全部楼层
isdkz 发表于 2023-5-1 16:54
是的,Ghostscript是一个单独的程序,需要在系统中单独安装。camelot库在后台使用Ghostscript来处理PDF文 ...

弄弄的GPT的味道哈哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-1 17:00:34 | 显示全部楼层
wlp1818100227 发表于 2023-5-1 16:59
弄弄的GPT的味道哈哈哈

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-1 17:02:07 | 显示全部楼层
sfqxx 发表于 2023-5-1 16:58
当遇到双栏的PDF时,提取表格可能会出现问题,因为每一页中的文本内容不一定按照水平顺序排列。您可以尝试 ...

__init__() got an unexpected keyword argument 'keep_blank_chars' 报这个错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-1 17:10:18 | 显示全部楼层
这个错误通常发生在使用 `django.contrib.auth.forms.AuthenticationForm` 类或类似的表单类时,该表单类接受了名为 `keep_blank_chars` 的参数,但是该参数在其父类中没有定义。

一种解决方法是在实例化表单类时不传递 `keep_blank_chars` 参数。例如:


form = AuthenticationForm(data=request.POST)

如果仍然遇到相同的错误,请检查您的 Django 版本是否与所用示例的版本不同。有时,更新版本可能会导致某些代码无法正常工作。

另外,您也可以尝试重新安装 Django 并确保所有依赖项已正确安装。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-23 11:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表