(大)数据处理:从txt到MySql的数据预处理迁徙

Python 2.7
IDE Pycharm 5.0.3
MySQL 5.7
MySQL Workbench 6.3


前言

学长毕业刚好在整大数据,从数据堂花了大价钱买的一个月的北京出租车GPS数据,一天大概11G,一个月就是350G左右,而且数据全部存在txt中,根本无法进行分析处理,而且重复数据非常多,这就需要把txt写到数据库中在进行操作了,于是,我尝试了自己的python。。。。。

猜一下数据

在没有拿到数据前,这是我从一篇博士论文上看到的数据样式:

博士论文片段

ok,看起来应该很简单的样子,所以我模拟了一下前几行数据,当然,虽然那么几行,但是我也懒得敲在txt上啊,所以我机智的想到了图像识别pytesser模块,刚好在以前做验证码识别的时候用到过,所以直接拿来用咯,如何使用pytesser请看Python+Selenium+PIL+Tesseract真正自动识别验证码进行一键登录


准备食材

第一步,先把图像切割下,然后保存在工程路径下,就像这样

需要的数据

然后,识别图中的数字并打印!

import pytesser
code= pytesser.image_file_to_string("C:\Users\MrLevo\Desktop\cardata.jpg")#code即为识别出的图片数字str类型
print code

当然,理想很丰满,现实太骨感,识别出个这么个玩意!

4S9309,4,1.20110701164753,11612693863,39,928S698,Z7,346,1
154s5s,4,1,20110701084818,115.5092316,39.7901344,15,58,1
49213s,4,1,20110701034811115 3o91025,4o.0215s27,2,2s4,0
035834,4,1,20l10701084811116 3768692,39.986Z785,l9,96,1
05s14e,4,0,201 107010343111 1614244843,39.8958397.48,352,1
这里写图片描述

哎,还是识别率太低了,所以没办法,手动复制再修改不一样的吧,大多数还是识别出来的。

最后就改成这样的

测试使用的数据

到这里总算把原料准备好了,这才开始正题!


臆想采集

靠着自己臆想出来的原料数据txt,把他写到sql中应该并不是很难,直接来。
至于怎么对用python写入数据库,请看Python+MySQL用户加密存储验证系统(进阶)Python与MySQL联动实例一两则

贴上核心代码

# -*- coding: utf-8 -*-
#Author:哈士奇说喵
import pymysql

#初始化数据库子函数
def Init():
    #创建数据库
    try:
        cur.execute('create database carnet')#创建名为professors数据库
        cur.execute('use carnet')#切到该数据库
        cur.execute('create TABLE store(id BIGINT(10) NOT NULL AUTO_INCREMENT,car VARCHAR(100),trigger_events VARCHAR(100),operation_state VARCHAR(100),times VARCHAR(100),longitude VARCHAR(100),latitude VARCHAR(100),speed VARCHAR(100),direction_angle VARCHAR(100),GPS_state VARCHAR(100),created TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,PRIMARY KEY(id))')
        print '-------------------------------Create Database Succeed-------------------------------'
    except:
        #print 'database existed'
        cur.execute('use carnet')#切到该数据库



#数据库的存储子函数
def store(a,b,c,d,e,f,g,h,i):
    cur.execute("insert into store(car,trigger_events,operation_state,times,longitude,latitude,speed,direction_angle,GPS_state) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s)",(a,b,c,d,e,f,g,h,i))

    cur.connection.commit()#commit()提交事物,做出改变后必须提交事务,不然不能更新


def readTxt():
    f = open("txt2sql.txt","r")
    while True:

        line = f.readline() #没有足够内存一次读取整个文件的时候要用readline,每次读一行
        if line:
            #print line
            content = line.split(",") #以逗号为分隔符
            store(content[0],content[1],content[2],content[3],content[4],content[5],content[6],content[7],content[8])
        else:
            break
    f.close()

def Main():

    Init()
    readTxt()

#程序入口
if __name__ == '__main__':

    try:
        conn = pymysql.connect(host = '127.0.0.1',user='root',passwd='A089363b',db='mysql',charset='utf8')
        #与数据库建立连接
        cur = conn.cursor()
        #实例化光标
        print "-------------------------------SQL Connection Succeed-------------------------------"

    except:
        print "Warning!SQL Connection Failed!"

    Main()
    
    try:
        cur.close()
        conn.close()
        print "-------------------------------SQL Connection Closed-------------------------------"
        print "-------------------------------Over-------------------------------"
    except:
        print "Warning!Can't Close Connection!"

最后实现效果如下,比较圆满,因为格式我看的很清楚,结合数据清洗,一下子就出来了。


实现效果

真实的数据

满心欢喜的以为和博士论文中的格式一样,直接套上就行,结果,你给我看这个???

买来的数据形式-分片后

因为,我的电脑,根本打不开那么大的txt!!!!这特么就尴尬了,,,,所以先让学弟把文件分片(我的天,11G的一个txt,他分成4200多个txt,额)。


分析解决

从上面的图可以看出,数据那么连续,而且杂乱无章,实在没办法,我用其他的编辑器打开(Notepad++打开)


使用notepad++打开效果

ok,好看多了,那么分析一下,数据之间有多个空格,而且不限个数,最后用了换行符来变成下一行数据,根据数据清洗的思想,我先把换行符改成空格,然后把多个空格替换为一个空格,最后用split对空格进行拆分,没错,应该就是这样。

实现代码,先对data0.txt数据进行测试分析(分片之一),限制mysql的显示行数为无限制,一个2.8MB的数据,我想也跑不出花的

# -*- coding: utf-8 -*-
#Author:哈士奇说喵
import pymysql
import re

#初始化数据库子函数
def Init():
    #创建数据库
    try:
        cur.execute('create database carnet')#创建名为professors数据库
        cur.execute('use carnet')#切到该数据库
        cur.execute('create TABLE store(id BIGINT(10) NOT NULL AUTO_INCREMENT,car VARCHAR(100),trigger_events VARCHAR(100),operation_state VARCHAR(100),times VARCHAR(100),longitude VARCHAR(100),latitude VARCHAR(100),speed VARCHAR(100),direction_angle VARCHAR(100),GPS_state VARCHAR(100),G10 VARCHAR(100),G11 VARCHAR(100),G12 VARCHAR(100),G13 VARCHAR(100),created TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,PRIMARY KEY(id))')
        print '-------------------------------Create Database Succeed-------------------------------'
    except:
        #print 'database existed'
        cur.execute('use carnet')#切到该数据库



#数据库的存储子函数
def store(a,b,c,d,e,f,g,h,i,j,k,l,m):
    cur.execute("insert into store(car,trigger_events,operation_state,times,longitude,latitude,speed,direction_angle,GPS_state,G10,G11,G12,G13) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)",(a,b,c,d,e,f,g,h,i,j,k,l,m))

    cur.connection.commit()#commit()提交事物,做出改变后必须提交事务,不然不能更新


def readTxt():
    f = open("C:\Users\MrLevo\Desktop\data0.txt","r")
    #f = open("H:\\20151208.txt","r")
    while True:
        line = f.readline()
        if line:          
            line = re.sub(' +'," ",line) #把多个空格替换成一个空格
            line = re.sub('\t',' ',line)#制表符也替换成空格
            content = line.split(" ")
            store(content[0],content[1],content[2],content[3],content[4],content[5],content[6],content[7],content[8],content[9],content[10],content[11],content[12].decode('utf-8'))
#content[12].decode('utf-8')因为第13个分割后的是中文字符,需要解码一下
        else:
            print 'txt2sql succeed!'
            break
    f.close()

def Main():

    Init()
    readTxt()

#程序入口
if __name__ == '__main__':

    try:
        conn = pymysql.connect(host = '127.0.0.1',user='root',passwd='A089363b',db='mysql',charset='utf8')
        #与数据库建立连接
        cur = conn.cursor()
        #实例化光标
        print "-------------------------------SQL Connection Succeed-------------------------------"

    except:
        print "Warning!SQL Connection Failed!"

    Main()
    
    try:
        cur.close()
        conn.close()
        print "-------------------------------SQL Connection Closed-------------------------------"
        print "-------------------------------Over-------------------------------"
    except:
        print "Warning!Can't Close Connection!"

之后大概过了三分钟,结束程序,采集到16905个数据,和txt中对应,成功。

分片的数据采集

挑战一下

既然能读分片后的数据,那么我尝试读一下11G的原始数据,吧sql显示行数控制在5W行,运行大概十五分钟停止。

5W组原始数据

瞎扯

推测一下,11G原始数据我电脑需要不停跑3.6天才能写完到数据库中,这才是数据写入而已啊,哎,还是用hadoop来做吧,不然真的会死人的,这才一天的GPS数据,要是一个月,一年,,,,,所以大数据的发展是必然趋势,我这里只是做一下测试,也算是真正对原始数据进行了一下简单的操作。


致谢

Python网络数据采集[Ryan Mitchell著][人民邮电出版社]
@MrLevo520--Python+MySQL用户加密存储验证系统(进阶)
@MrLevo520--Python与MySQL联动实例一两则
@MrLevo520--Python+Selenium+PIL+Tesseract真正自动识别验证码进行一键登录

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容