今日代碼(200612)--數據錄入(python+mysql)

代碼筆記,僅供參考,有錯必糾,別買謝謝
限免:6小時




任務


現在要對一堆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 pymysql

class EiDealData:
    def __init__(self):
        self.path = r"F:\MyStudio\PythonStudio\goatbishop.project01\MyNewWork"
        self.RunData = {}
        self.countFileNun = 0
        self.count1 = 0
        self.count2 = 0
        self.filter1 = 0
        self.filter2 = 0
        self.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 + "\\" + item
                fileName2 = 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 + "\\" + file
                        with 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 = -1
                                            elif temp[0] == "DQ":
                                                result = -2
                                            elif temp[0] == "DNS":
                                                result = -3
                                        else:
                                            #print(temp)
                                            #print(data)
                                            result = -4
                                        
                                    if reaction:
                                        reaction = float(reaction[0])
                                    else:
                                        data = f.readline()
                                        self.filter1 +=1
                                        continue
                                    
                                    try:
                                        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 = 1
                                    else:
                                        fn = 0
                        
                                    self.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 = 0
                self.writeMysql(item)
                self.RunData = {}
        
    def writeCsv(self):
            pass
    def writeMysql(self, RunYear):
            dataDealed = self.RunData
            
            for 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條記錄。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章