代码笔记,仅供参考,有错必纠,别买谢谢
限免:6小时


文章目录

  • 任务
  • python代码
  • mysql数据库

任务

现在要对一堆PDF文档里的数据进行数据提取,规整并整理成一个完整的数据表。

PDF里的数据的格式是这样的(由于数据不可外泄,所以我进行马赛克处理,只保留部分数据):

)

上面显示的表格是我们需要的数据,当然,这个PDF文档中还有很多我们不需要的干扰数据,所以,我用正则表达式去匹配我需要的数据,并添加了一些条件,禁止干扰数据进入我们最后的数据表中。

这些PDF文档的名字很规整,方便我们处理,我们可以利用PDF名称的信息对从提取到的数据进行归类:

)

这些PDF文件里的数据分别在2011年、2013年、2015年、2017年和2019年记录的,所以分别放在下面这5个文件夹里:

)

因为我现在还真不知道有什么直接读PDF的手段,也不会把PDF转成txt或者其他格式的技术,所以这里自己手动复制到Excel中,再转成csv文件了,转成csv方便我们读取(之前倒是试了试用CAJViewer把PDF转成txt,但是效果不是我想要的那样):

)

最后,我们需要提取到PDF中result, reaction,DATE of BIRTH,Fn四个变量,并且将数据记录的年份(比如2019年)和数据分类信息记录在同一个表中,并导入mysql中,由此,我创建了一个mysql数据表:

CREATE TABLE RunData(id int(11) primary key auto_increment,
PersonDATE date,
RESULT float(4,2),
REACTION float(4,3),
FN int,
CompetitionType varchar(20),
ProjectClass varchar(20),
RunYear YEAR);

python代码

下面是python代码:

# -*- coding: utf-8 -*-import re
import datetime
import os
from pandas import DataFrame
import pandas as pd
import pymysqlclass EiDealData:def __init__(self):self.path = r"F:\MyStudio\PythonStudio\goatbishop.project01\MyNewWork"self.RunData = {}self.countFileNun = 0self.count1 = 0self.count2 = 0self.filter1 = 0self.filter2 = 0self.db = pymysql.connect(host = '127.0.0.1',port = 3306,user = 'root',password = '19970928',database = 'datacup',charset = 'utf8')self.cur = self.db.cursor()def GetFile(self):fileName = os.listdir(self.path)self.GetFormatData(fileName)def GetFormatData(self, fileName):for item in fileName:if os.path.isdir(item):path = self.path + "\\" + itemfileName2 = os.listdir(path)for file in fileName2:if file.endswith(".csv"):self.countFileNun +=1#print(file)#判断后缀fNameDeal = re.split("\W+", file)#print(fNameDeal)sonDictName = "R_"+ "".join(fNameDeal[0:(len(fNameDeal)- 1)])self.RunData[sonDictName] = {}self.RunData[sonDictName]["REACTION"] = []self.RunData[sonDictName]["RESULT"] = []self.RunData[sonDictName]["DATE"] = []self.RunData[sonDictName]["FN"] = [] #0为没有犯规,1为犯规ReadFilePath = path + "\\" + filewith open(ReadFilePath, 'r') as f:data = f.readline()#print(data)while (data):start_char = data[0]#flag1 = re.findall(r"\+|\(|\)", data)#print(flag1)flag2 = len(re.split("\W", data))#print(flag2)if ((ord(start_char) >= 49) & (ord(start_char) <= 57) & (len(data) >= 16) & (flag2 >= 9)):self.count1 +=1#ord("a")为计算"a"的ASCII码值pattern0 = r"\b\d{1,2}\.\d{2}\b"pattern1 = r"\b\d\.\d{3}\b"pattern2 = r"\d{1,2} [A-Z][a-zA-Z]{2} \d{2}\b"result = re.findall(pattern0, data)reaction = re.findall(pattern1, data)if result:result = float(result[0])else:temp = re.findall(r"DNF|DQ|DNS", data)if temp:if temp[0] == "DNF":result = -1elif temp[0] == "DQ":result = -2elif temp[0] == "DNS":result = -3else:#print(temp)#print(data)result = -4if reaction:reaction = float(reaction[0])else:data = f.readline()self.filter1 +=1continuetry:date = re.findall(pattern2, data)[0]except Exception as e:print("匹配异常,可能是原始数据不规整")deal_date = "2020-01-01"else:deal_date = datetime.datetime.strptime(date,'%d %b %y').strftime('%Y-%m-%d')#print(date)fn = re.findall(r"\bF\b|\bF1\b", data)#print(fn)if fn:fn = 1else:fn = 0self.RunData[sonDictName]["RESULT"].append(result)self.RunData[sonDictName]["REACTION"].append(reaction)self.RunData[sonDictName]["DATE"].append(deal_date)self.RunData[sonDictName]["FN"].append(fn)data = f.readline()print(item, self.countFileNun)self.countFileNun = 0self.writeMysql(item)self.RunData = {}def writeCsv(self):passdef writeMysql(self, RunYear):dataDealed = self.RunDatafor key in dataDealed:#print(key)CompetitionType = re.findall(r"n(Final)|(Round1)|(SemiFinal)|(Preliminary)", key)[0]CompetitionType = "".join(CompetitionType)ProjectClass = re.findall(r"\d{3}|hurdles", key)ProjectClass = "".join(ProjectClass)#print(len(dataDealed[key]["DATE"]))self.count2 += len(dataDealed[key]["DATE"])ProjectClassL = [ProjectClass]*len(dataDealed[key]["DATE"])#CompetitionType = "".join(cp_list)#print(CompetitionType)CompetitionTypeL = [CompetitionType]*len(dataDealed[key]["DATE"])RunYearL = [RunYear]*len(dataDealed[key]["DATE"])tempData = zip(dataDealed[key]["DATE"], dataDealed[key]["RESULT"],dataDealed[key]["REACTION"], dataDealed[key]["FN"], CompetitionTypeL,ProjectClassL,RunYearL)for item in tempData:#print(item)try:sql = 'insert into RunData(PersonDATE,RESULT,REACTION,FN,CompetitionType,ProjectClass,RunYear) \values(%s, %s, %s, %s, %s, %s, %s);'self.cur.execute(sql, item)self.db.commit()print("提交成功...")                             except Exception as e:self.db.rollback()print("错误信息:", e)def main(self):self.GetFile()#self.writeMysql()self.cur.close()self.db.close()           if __name__ == "__main__":eiDeal = EiDealData()eiDeal.main()print("进入规则内个数:",eiDeal.count1)print("实际导入sql个数",eiDeal.count2)print("过滤掉数据个数:",eiDeal.filter1)

部分输出:

提交成功...
提交成功...
提交成功...
进入规则内个数: 4051
实际导入sql个数 2463
过滤掉数据个数: 1588

mysql数据库

现在,我们看看mysql中是否导入2463条数据。

sql语言:

select * from RunData limit 3000;

输出:

18:17:36 select * from RunData limit 3000    2463 row(s) returned    0.000 sec / 0.015 sec

可以看到,我们已经收集到了2363条数据,现在我们查询result=-2的记录:

SELECT * FROM RunData WHERE result=-2;

输出:

21:31:00 SELECT * FROM RunData WHERE result=-2 LIMIT 0, 1000    19 row(s) returned  0.000 sec / 0.000 sec

可以看到查询到19条记录。

今日代码(200612)--数据录入(python+mysql)相关推荐

  1. 今日代码(200725)--数据录入(python+mysql)

    代码记录 数据录入(python+mysql) 前言 相比于200612代码增加了一个性别.运动员编号.运动员姓名字段. 代码 # -*- coding: utf-8 -*-import re imp ...

  2. Python—Mysql—Dbvisualizer

    MySQLdb: https://pypi.python.org/pypi/MySQL-python/1.2.4 import MySQLdb 1.Download Connector/Python: ...

  3. python MySQL 插入Elasticsearch

    一.需求分析 注意: 本环境使用 elasticsearch 7.0版本开发,切勿低于此版本 mysql 表结构 有一张表,记录的数据特别的多,需要将7天前的记录,插入到Elasticsearch中, ...

  4. pythonencoding etf-8_etf iopv python 代码30个Python常用小技巧

    1.原地交换两个数字x, y =10, 20 print(x, y) y, x = x, y print(x, y) 10 20 20 10 2.链状比较操作符n = 10 print(1 print ...

  5. python mysql操作_Python的MySQL操作

    Python的DB-API,为大多数的数据库实现了接口,使用它连接各数据库后,就可以用相同的方式操作各数据库. Python DB-API使用流程: 引入API模块. 获取与数据库的连接. 执行SQL ...

  6. Django Python MySQL Linux 开发环境搭建

    Django Python MySQL Linux 开发环境搭建 1.安装Python 进行Python开发,首先必须安装python,对于linux 或者Mac 用户,python已经预装. 在命令 ...

  7. python mysql返回,python操作mysql数据-执行语句返回值直接返回字典类型

    fetchall()将结果放在二维数组里面,每一行的结果在元组里面 import pymysql def export(table_name): conn =pymysql.connect(host ...

  8. python mysql ssl,python – 在SQLAlchemy中使用SSL

    我最近改变了我的项目使用SQLAlchemy并且我的项目运行正常,它使用了外部MySQL服务器. 现在我正在尝试使用具有SSL CA的不同MySQL服务器,并且它不会连接. (它确实使用MySQL W ...

  9. python mysql工具类_Python工具类(一)—— 操作Mysql数据库

    如何调用直接看__main__函数里如何调用此工具类就阔以啦! # encoding=utf-8 import pymysql # 导入所有Mysql配置常量,请自行指定文件 from conf.se ...

最新文章

  1. 智能合约语言 Solidity 教程系列8 - Solidity API
  2. Flex与.NET互操作(十四):FluorineFx的AMF协议通信
  3. boot gwt_带Spring Boot的GWT
  4. 08-mysql-条件查询-常见函数与小结
  5. Python filecmp库
  6. 清华大学登顶亚洲第一:2019泰晤士高等教育世界大学排名发布
  7. Web项目下的WebRoot和WebContent
  8. fir.im Weekly - 工欲善其事,必先利其器
  9. 【转】java枚举类型ENUM
  10. ASROCK X399 PROFESSIONAL GAMING R1.02(70-MXB5Q0-A01)华擎点位图
  11. oracle ogg是什么
  12. adb 命令连接天天,海马,mumu,逍遥游模拟器
  13. 跨越专业翻译的语言之墙:百度翻译的技术攀登
  14. Android Hotfix 新方案——Amigo 源码解读
  15. 刺激战场android闪退,刺激战场闪退怎么办
  16. uniapp 消息推送与透传+语音播报
  17. 基于SPI协议的Flash驱动控制-扇区擦除
  18. 互联网对现代科技企业管理的影响
  19. 计算机与汽车的论文,汽车计算机网络技术论文
  20. W7正在锁定计算机,win7输错密码锁定了怎么办 win7电脑被锁定的解锁方法

热门文章

  1. 固态+机械(uefi类型的bios),用easybcd安装win10+ubuntu16.04双系统
  2. Mybatis报错: Invalid bound statement (not found)...
  3. 求栈的长度的C语言函数,c – 编译器如何确定编译器生成的临时函数所需的堆栈大小?...
  4. java中apache安装与配置_Apache应用服务器之四:Apache与Tomcat安装与配置
  5. MySQL中的UNIX_TIMESTAMP函数使用总结
  6. centos5.5中安装mysql5.5.3
  7. textarea 输入框限制字数
  8. css两列布局之基于BFC规则实现
  9. tomcat8 安装|解决启动慢|进入管理|host-manager 403错误
  10. (深入.Net平台和C#编程)第七章.上机练习.20170412