您的位置:首页 > 汽车 > 时评 > 网站搭建团队_网页设计与制作课程设计报告小结_360推广_怎么自己创建网页

网站搭建团队_网页设计与制作课程设计报告小结_360推广_怎么自己创建网页

2025/4/16 7:36:54 来源:https://blog.csdn.net/pdsu_Zhe/article/details/147127292  浏览:    关键词:网站搭建团队_网页设计与制作课程设计报告小结_360推广_怎么自己创建网页
网站搭建团队_网页设计与制作课程设计报告小结_360推广_怎么自己创建网页

文章目录

  • 先说结论
  • 前因后果
  • 思路
    • 1、PDF2CSV
    • 2、PDF2MD → MD2CSV
    • 3、针对不同表格的两种思路
      • 1) 竖形三线表
      • 2)五元素为一组
  • 还没结束
    • 批量处理
      • 1、分割markdown文档
      • 2、跳过另一种格式的文档
  • 总结一下


先说结论

        结论就是,博主用了一天的时间去研究如何把PDF的表格内容,转换为csv文件,下面放图。
        这次转换的文档是国标GB/T2260—2007,GB/T2260《中华人民共和国行政区划代码》自1980年发布以来,已广泛应用于我国计划、统计、人口普查、经济普查、农业普查、社会保障、信息化、教育、人事管理、组织机构管理等诸多领域。
在这里插入图片描述

转换为👇

在这里插入图片描述


请注意:本篇不太赘述太多代码,主要讲解决思路。


前因后果

        因为博主的课题是知识图谱方向,所以想找一些内容来测试一下图谱构建,图谱构建的第一步就是去构建实体和关系,所以我想到一个关系性很强的内容,就是今天测试的内容,我国的行政区,包含省市县区,他们中间的关系也很明确。
        那么好,回到文档,起初拿到这个文档的时候,我想着要不就手动复制,反正现在各种OCR技术都这么强,结果发现正片文档整整247页,就以我需要整理的内容来说也有130页左右,这样手动构建肯定是不合适的,费时费力。
在这里插入图片描述
        所以,我就想到能不能搞点代码来解决,其实目前大模型技术发展很迅速了,各种单模态的,多模态的,专门处理表格的,其实把这些交给大模型让它们生成结构化的文档也很方便,不过博主还是喜欢去探究一下本质,所以选择用传统方法。

思路

1、PDF2CSV

        前期的思路是,直接PDF转CSV,目前有很多第三方库也都支持,Camelot、Tabula-py、pdf2csv,都不错,但是回归到根源,从文档本身出发,可以看到这是一个算是竖形的三线表格式的,这些第三方库去处理的时候都会把第一列的所有内容放在一个单元格中,等于说白干,那么我想能不能用另一种格式做一个过渡呢,这种格式还得是普遍被接收了,那么想到了一种符合当前要求的——markdown
在这里插入图片描述


2、PDF2MD → MD2CSV

        PDF识别表格转成markdown格式也是一种思路,再用markdown的特点,有固定的表格格式,方便分割,思路有了,开始实操。
        这次选择的是pdfplumber,它有一个extract_tables()方法,可以提取PDF中的表格。

    def extract_tables(self, table_settings: Optional[T_table_settings] = None) -> List[List[List[Optional[str]]]]:tset = TableSettings.resolve(table_settings)tables = self.find_tables(tset)return [table.extract(**(tset.text_settings or {})) for table in tables]def extract_table(self, table_settings: Optional[T_table_settings] = None) -> Optional[List[List[Optional[str]]]]:tset = TableSettings.resolve(table_settings)table = self.find_table(tset)if table is None:return Noneelse:return table.extract(**(tset.text_settings or {}))

提取后转为markdown格式,内容如下:

#篇幅有限取前六个元素作为示例
| 名 称 | 罗马字母拼写 | 数字码 | 字母码 |
|  --- | --- | --- | --- |
| 北京市
天津市
河北省
山西省
内蒙古自治区
辽宁省| BeijingShi
TianjinShi
HebeiSheng
ShanxiSheng
NeiMongolZizhiqu
LiaoningSheng | 110000
120000
130000
140000
150000
210000| BJ
TJ
HE
SX
NM
LN|

        从转换的文档看,因为markdown表格格式限制,各个元素中存在换行符,没法变为表格。
        不过,博主灵机一动,那我把它们全部转为字符串,再以“|”为分割,把第一个单元格的的第一个元素作为表格里第一列的第一个,第二个单元格的第一个作为第二列的第二个,以此类推…

在这里插入图片描述

观察生成的md文件,发现总共有两种形式的md文档
第一种是刚才讲的这种,第二种是下图这样的,所有元素都在同一个单元格中,中间以空格隔开
在这里插入图片描述


3、针对不同表格的两种思路

        那么针对这两种的表格,有了下面两个思路

1) 竖形三线表

        这种思路参照刚才讲的把第一个单元格的的第一个元素作为表格里第一列的第一个,第二个单元格的第一个作为第二列的第二个,讲关键步骤
1、将数据行转换为一个长字符串,保留原始的换行符

| 北京市 天津市 河北省 山西省 内蒙古自治区 辽宁省 吉林省 黑龙江省 上海市 江苏省 浙江省 安徽省 福建省 江西省 山东省 河南省 湖北省 湖南省 广东省 广西壮族自治区 海南省 重庆市 四川省 贵州省 云南省 西藏自治区 陕西省 甘肃省 青海省 宁夏回族自治区 新疆维吾尔自治区 台湾省 香港特别行政区 澳门特别行政区 | BeijingShi TianjinShi HebeiSheng ShanxiSheng NeiMongolZizhiqu LiaoningSheng JilinSheng HeilongjiangSheng ShanghaiShi JiangsuSheng ZhejiangSheng AnhuiSheng FujianSheng JiangxiSheng ShandongSheng HenanSheng HubeiSheng HunanSheng GuangdongSheng GuangxiZhuangzuZizhiqu HainanSheng ChongqingShi SichuanSheng GuizhouSheng YunnanSheng XizangZizhiqu ShaanxiSheng GansuSheng QinghaiSheng NingxiaHuizuZizhiqu XinjiangUygurZizhiqu TaiwanSheng HongkongTebiexingzhengqu | 110000 120000 130000 140000 150000 210000 220000 230000 310000 320000 330000 340000 350000 360000 370000 410000 420000 430000 440000 450000 460000 500000 510000 520000 530000 540000 610000 620000 630000 640000 650000 710000 810000 | BJ TJ HE SX NM LN JL HL SH JS ZJ AH FJ JX SD HA HB HN GD GX HI CQ SC GZ YN XZ SN GS QH NX XJ TW HK |

2、使用正则表达式在每个 | 符号的前后都加上换行符
呈现的结果是这样的,那么可以看到每一列都被完美的隔离开,并且每个元素中间都有空格
在这里插入图片描述

3、按行分割清洗后的内容

['|', ' 北京市 天津市 河北省 山西省 内蒙古自治区 辽宁省 吉林省 黑龙江省 上海市 江苏省 浙江省 安徽省 福建省 江西省 山东省 河南省 湖北省 湖南省 广东省 广西壮族自治区 海南省 重庆市 四川省 贵州省 云南省 西藏自治区 陕西省 甘肃省 青海省 宁夏回族自治区 新疆维吾尔自治区 台湾省 香港特别行政区 澳门特别行政区 ', '|', ' BeijingShi TianjinShi HebeiSheng ShanxiSheng NeiMongolZizhiqu LiaoningSheng JilinSheng HeilongjiangSheng ShanghaiShi JiangsuSheng ZhejiangSheng AnhuiSheng FujianSheng JiangxiSheng ShandongSheng HenanSheng HubeiSheng HunanSheng GuangdongSheng GuangxiZhuangzuZizhiqu HainanSheng ChongqingShi SichuanSheng GuizhouSheng YunnanSheng XizangZizhiqu ShaanxiSheng GansuSheng QinghaiSheng NingxiaHuizuZizhiqu XinjiangUygurZizhiqu TaiwanSheng HongkongTebiexingzhengqu ', '|', ' 110000 120000 130000 140000 150000 210000 220000 230000 310000 320000 330000 340000 350000 360000 370000 410000 420000 430000 440000 450000 460000 500000 510000 520000 530000 540000 610000 620000 630000 640000 650000 710000 810000 ', '|', ' BJ TJ HE SX NM LN JL HL SH JS ZJ AH FJ JX SD HA HB HN GD GX HI CQ SC GZ YN XZ SN GS QH NX XJ TW HK ', '|']

4、构造两个数组,分别遍历
        这里定义了两个数组,大的数组存储每一组数据,小数组放每一组数据的具体信息,遍历后结果如下:

[
['北京市', 'BeijingShi', '110000', 'BJ'], 
['天津市', 'TianjinShi', '120000', 'TJ'], 
['河北省', 'HebeiSheng', '130000', 'HE'],
['山西省', 'ShanxiSheng', '140000', 'SX'], 
['内蒙古自治区', 'NeiMongolZizhiqu', '150000', 'NM'], 
['辽宁省', 'LiaoningSheng', '210000', 'LN'], 
['吉林省', 'JilinSheng', '220000', 'JL']
]

        那么后面转csv就不讲了,逐行遍历逗号隔开即可。


2)五元素为一组

        那么有了上一个处理的思路,这个处理思路更快的就想出来了,还是转换为字符串,但是这次就不要“|”为分割了,所以处理字符串的时候直接删掉,只留元素和空格,每五个元素为一行。
1、将数据行转换为一个长字符串,保留空格

越西县 四川省 YuexiXian YXC 513434 越秀区 广东省广州市 YuexiuQu YXU 440104 云县 云南省 YunXian YXP 530922 云安县 广东省 Yun’anXian YUA 445323 云城区 广东省云浮市 YunchengQu YYF 445302 云浮市 广东省 YunfuShi YFS 445300 云和县 浙江省 YunheXian YNH 331125 云龙区 江苏省徐州市 YunlongQu YLF 320303 云龙县 云南省 YunlongXian YLO 532929 云梦县 湖北省 YunmengXian YMX 420923 云南省 YunnanSheng YN 530000 云溪区 湖南省岳阳市 YunxiQu YXI 430603 云霄县 福建省 YunxiaoXian YXO 350622 云岩区 贵州省贵阳市 YunyanQu YYQ 520103 云阳县 重庆市 YunyangXian YNY 500235 郧县 湖北省 YunXian YUN 420321 郧西县 湖北省 YunxiXian YNX 420322 运城市 山西省 YunchengShi YCE 140800 运河区 河北省沧州市 YunheQu YHC 130903 郓城县 山东省 YunchengXian YCR 371725 杂多县 青海省 ZadoiXian ZAD 632722 赞皇县 河北省 ZanhuangXian ZHG 130129 枣强县 河北省 ZaoqiangXian ZQJ 131121 枣阳市 湖北省 ZaoyangShi ZOY 420683 枣庄市 山东省 ZaozhuangShi ZZG 370400 泽库县 青海省 ZêkogXian ZEK 632323 泽普县 新疆维吾尔自治区 Zepu(Poskam)Xian ZEP 653124 泽州县 山西省 ZezhouXian ZEZ 140525 曾都区 湖北省随州市 ZengduQu ZDU 421302 增城市 广东省 ZengchengShi ZEC 440183 扎赉特旗 内蒙古自治区 JalaidQi JAL 152223 扎兰屯市 内蒙古自治区 ZalantunShi ZLT 150783 扎鲁特旗 内蒙古自治区 JarudQi JAR 150526 扎囊县 西藏自治区 Chanang(Chatang)Xian CNG 542222 札达县 西藏自治区              

2、遍历列表,按固定数量进行分组

# 初始化一个列表来存储分组后的数据groups = []current_group = []# 遍历列表,按固定数量进行分组for item in data_content.split():item = item.strip()  # 去除元素前后的空格if item:  # 忽略空字符串current_group.append(item)print(current_group)# 每五个元素换行if len(current_group) == 5:groups.append(current_group)current_group = []

最后的效果是这样的:
在这里插入图片描述


还没结束

批量处理

这两个代码固然可以提速,但我处理的md格式的文档有30929行,每一个表格大概是130行,那么我就要处理三百余次,虽然手动处理可以,但是还是觉得效率低,在处理了差不多100个的时候就觉得有点累了,所以我就在想如何可以让他批量处理

1、分割markdown文档

        因为前面也讲了,我这个markdown文档里发现识别了两种表格,那么我一次处理全部的当然不合适,所以我的思路是先根据文档特点去分割markdown文档为不同的文件,再根据不同的文件结构用不同的方法。
在这里插入图片描述
        文档里每个表格之间都有一行空白行,那么就以它为标识符去分割,最后在剩余的文档里分出来了56个文档
在这里插入图片描述

2、跳过另一种格式的文档

        经过看每个文档发现,第二种类的文档还是比较少,有以下这几个,那么我在处理的时候跳过这些即可,去批量处理。

skip_tables = {8, 11, 14, 16, 20, 21, 28, 33,37, 44, 52}

在这里插入图片描述


总结一下

        在当今时代,AI 的强大能力确实为我们的学习和生活带来了极大的便利,但过度依赖它却可能削弱我们的思维能力。我们应将 AI 视为助力而非拐杖,在借助其高效处理数据和执行任务的同时,积极锻炼自己的思维,尤其是代码思维。这种严谨的逻辑思维不仅能帮助我们更好地与 AI 沟通协作,还能在复杂多变的现实中发挥独特价值,从而在人机合作中提升效率,实现优势互补。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com