python將json文件寫入mysql

公司之前產(chǎn)品的數(shù)據(jù)集需要手工導(dǎo)入,著實麻煩,需要用idea客戶端用transport的方式導(dǎo)入。數(shù)據(jù)是json的格式

現(xiàn)在新實現(xiàn)集成了數(shù)據(jù)連接和數(shù)據(jù)集部分,這樣就可以從mysql,oracle,postgressql等數(shù)據(jù)庫中進(jìn)行數(shù)據(jù)導(dǎo)入了。

比較費勁的地方是json類型格式比較復(fù)雜,需要覆蓋的類型也比較多,在導(dǎo)入mysql時麻煩些。

使用的是jupyter,進(jìn)行調(diào)試,需要先安裝python3,然后直接pip進(jìn)行安裝jupyter就行

在cmd情況下,輸入jupyter notebook,界面就可以調(diào)試了

json數(shù)據(jù)如下:一條很長,里面有基本類型,也覆蓋了數(shù)據(jù)和嵌套類型

{"centerlat":"36.7","c_uuid":"914e674f-b3d1-4650-b916-9a9432f9a757","centerlong":"119.15","c_month_z": "12月", "c_month_e": "July", "c_province": "遼寧省", "c_province_lat_float": 40.9975197, "c_province_long_float": 122.9955469, "c_province_lat_str": "40.9975197", "c_province_long_str": "122.9955469", "c_city_suffix": "自治縣", "c_suffix": "傳媒有限公司", "c_am_pm": "PM", "c_phone_prefix": 186, "c_int": 888888, "c_long": 2018080100000966, "c_boolean": true, "c_text": "今天游戲個人發(fā)現(xiàn).\n方面當(dāng)前回復(fù)我的圖片當(dāng)前.不會提供一點.\n經(jīng)濟如此是否.工具顯示用戶設(shè)計功能由于不斷.還有目前目前認(rèn)為.\n關(guān)于程序汽車.\n一下推薦活動報告發(fā)現(xiàn)設(shè)備看到.服務(wù)標(biāo)題如果他們搜索對于.\n經(jīng)濟回復(fù)其中情況但是一種.質(zhì)量法律社會方面孩子行業(yè).\n提供成功文章市場歡迎次數(shù)工作.過程當(dāng)然主要最后基本朋友學(xué)校.可以或者處理不能次數(shù)更新.免費繼續(xù)男人基本學(xué)習(xí).", "c_date_time": "1980-07-08 12:24:19", "c_float": 8.888888, "c_double": 1.563625140598217, "a_string": ["07月", "July", "廣西壯族自治區(qū)", "傳媒有限公司", "PM"], "a_int": [5520, 1755, 9946], "a_boolean": [false, true, false], "a_long": [2018080100008286, 2018080100009688, 2018080100002045], "a_float": [-9.936871, 9.200286, 0.227174], "a_double": [0.948297853565107, 4.387693154988151, 7.837379360507783], "a_datetime": ["2012-10-15 22:51:14", "1992-08-31 00:35:26", "1986-12-09 04:22:25"], "a_string_x": ["08月", "07月", "04月", "05月", "03月", "February", "December", "June", "May", "February", "湖南省", "云南省", "西藏自治區(qū)", "陜西省", "西藏自治區(qū)", "網(wǎng)絡(luò)有限公司", "網(wǎng)絡(luò)有限公司", "信息有限公司", "信息有限公司", "科技有限公司", "PM", "PM", "PM", "PM", "PM"], "a_int_x": [8213, 5411, 4780, 1097, 3152, 8346, 5214, 2980, 9402, 6376, 73, 3217, 9447, 2519, 9497, 9462, 7484, 1183, 3740, 3622, 6836, 3490, 5658, 9821, 1414, 2810, 3655, 2052, 4547, 9179, 2921, 4317, 276, 4959, 7332], "a_boolean_x": [true, false, false, false, true, true, false, true, false, false, true, false, false, false, false, false, true, false, true, false, false, true, false, true, false, true, true, false, false, true], "a_long_x": [2018080100000618, 2018080100000192, 2018080100004174, 2018080100000438, 2018080100007279, 2018080100002698, 2018080100008121, 2018080100007587, 2018080100005749, 2018080100002189, 2018080100007644, 2018080100005060, 2018080100007225, 2018080100001408, 2018080100008636], "a_float_x": [-6.518344, 8.64907, 3.163606, -6.859527, 1.917594, 7.104616, -4.137235, 8.795582, -7.3253, 4.734343, 7.92539, 4.679045, -1.454179, -1.71782], "a_double_x": [1.973857836352327, 7.566745946916848, -1.13668647252004, 4.216995855720113, 3.701736841818147, 2.693629017280139, -9.749026781233644, 2.45982713302184, -4.292622725494931, -6.187975835974211, 9.78922588463684, -5.789005326877345, -1.68020969703246, -8.504570803301425], "a_datetime_x": ["1978-02-20 01:23:19", "1983-05-18 01:43:16", "1999-11-07 13:05:36", "2007-11-12 08:30:13", "1981-02-03 18:49:06", "1996-02-09 10:45:19", "2018-06-26 14:20:32", "1975-10-07 18:08:59", "2014-02-02 01:34:13", "1993-08-01 11:50:39", "2003-04-06 13:59:34", "2012-03-04 23:56:24", "1985-05-16 21:16:33", "2005-01-14 15:14:12", "2014-10-20 00:16:47", "2001-01-04 14:58:31", "1984-09-15 16:48:09", "2000-06-13 18:56:14", "2008-10-28 06:10:59", "2013-08-16 23:35:48", "1998-06-02 23:44:43", "1970-08-11 20:02:22", "1988-12-08 14:31:30", "2016-04-28 08:48:32", "1989-12-02 14:30:18"], "a_zero": [], "c_nested": [{"n_month_z": "03月", "n_month_e": "February", "n_province": "浙江省", "n_suffix": "網(wǎng)絡(luò)有限公司", "n_am_pm": "PM", "n_phone_prefix": 138, "n_int": 7016, "n_boolean": false, "n_long": 2018080100009536, "n_string": "進(jìn)入情況這里密碼一直使用.出來根據(jù)感覺有些或者以下.類別地址以下一定系列發(fā)現(xiàn).\n的是聯(lián)系合作出來可以一直.單位那些大小決定.\n幫助瀏覽軟件最后.如此不要很多.\n看到中文有關(guān)根據(jù)是否發(fā)布最新.評論有關(guān)為什分析一定規(guī)定.社區(qū)幫助地方上海.\n威望希望這里系統(tǒng)關(guān)系東西加入.繼續(xù)就是全國其他不是東西.他們公司如此如何是一.由于大家我的操作產(chǎn)品.\n人員大學(xué)正在之后您的.建設(shè)生產(chǎn)那個以及北京學(xué)生支持已經(jīng).", "n_float": 0.258646, "n_double": 4.91129193319022, "n_date": "1970-01-28", "n_datetime": "1982-08-17 20:09:13"}, {"n_month_z": "06月", "n_month_e": "January", "n_province": "吉林省", "n_suffix": "科技有限公司", "n_am_pm": "AM", "n_phone_prefix": 136, "n_int": 4032, "n_boolean": true, "n_long": 2018080100006603, "n_string": "介紹設(shè)備責(zé)任文件組織基本服務(wù)知道.系列游戲經(jīng)營北京開始搜索搜索.如此中心規(guī)定首頁還是留言全國.\n內(nèi)容注意過程位置希望都是實現(xiàn).瀏覽看到美國.帖子北京價格認(rèn)為工程當(dāng)前.\n名稱一直地方方面中國不會她的政府.問題功能應(yīng)用其實.\n更新是一設(shè)備廣告中國文件這些操作.相關(guān)無法以后準(zhǔn)備發(fā)表已經(jīng)方法.這種這樣用戶基本原因行業(yè).\n必須參加問題狀態(tài)只要.", "n_float": 9.939012, "n_double": -6.903178820786101, "n_date": "2019-02-15", "n_datetime": "1982-11-06 06:11:37"}, {"n_month_z": "08月", "n_month_e": "October", "n_province": "吉林省", "n_suffix": "信息有限公司", "n_am_pm": "AM", "n_phone_prefix": 137, "n_int": 1800, "n_boolean": true, "n_long": 2018080100001744, "n_string": "歷史兩個電子你們來源.質(zhì)量控制科技.\n地址的話項目說明企業(yè)顯示空間.或者文件市場其他如此閱讀公司.\n現(xiàn)在今天如果.\n學(xué)習(xí)簡介完成其實已經(jīng).社區(qū)地址有些的人發(fā)現(xiàn)電話.\n以及經(jīng)驗直接有些程序看到.應(yīng)用新聞?wù)Z言回復(fù)人民增加選擇.\n經(jīng)濟世界用戶得到.活動無法市場的是論壇.\n日期圖片得到中心能夠.他們政府同時那些只有.\n那么大學(xué)有限問題處理經(jīng)營公司.電腦相關(guān)處理自己.", "n_float": 2.282995, "n_double": 0.832995965797904, "n_date": "1979-01-28", "n_datetime": "1972-04-13 18:58:02"}]}

python中使用pymyql進(jìn)行數(shù)據(jù)庫的連接

import json
import pymysql
#mysql的數(shù)據(jù)庫連接信息
conn = pymysql.connect(
    #服務(wù)器地址
        host = '10.6.6.38',
    #端口號
        port = 3307,
    #用戶名
        user = 'root',
    #密碼
        passwd = 'xdata123',
    #數(shù)據(jù)庫名稱
        db = 'dpltest',
    #字符編碼格式
        charset = 'utf8',
    )
#設(shè)置游標(biāo),進(jìn)行數(shù)據(jù)庫操作
cur = conn.cursor()

連接完成后,需要進(jìn)行表的創(chuàng)建,不得不說,這個表著實。。

#sql = "CREATE TABLE view63_tbl12(centerlat decimal(10,7) DEFAULT NULL,c_uuid VARCHAR(36) DEFAULT NULL ,centerlong decimal(10,7) DEFAULT NULL,c_month_z varchar(6) DEFAULT NULL,c_month_e varchar(15) DEFAULT NULL,c_province varchar(25) DEFAULT NULL, c_province_lat_float float(15,7) DEFAULT NULL,c_province_long_float float(20,10) DEFAULT NULL,c_province_lat_str varchar(15) DEFAULT NULL,c_province_long_str varchar(20) DEFAULT NULL,c_city_suffix VARCHAR(30) DEFAULT NULL ,c_suffix VARCHAR(30) DEFAULT NULL ,c_am_pm VARCHAR(10) DEFAULT NULL,c_phone_prefix VARCHAR(15) DEFAULT NULL,c_int int(11) DEFAULT NULL ,c_long bigint(40) DEFAULT NULL ,c_boolean tinyint(1) DEFAULT NULL, c_text text,c_date_time datetime(3),c_float float(10,7) DEFAULT NULL ,c_double double(20,18) DEFAULT NULL ,a_string varchar(1024) DEFAULT NULL ,a_int varchar(1024) DEFAULT NULL ,a_boolean varchar(1024) DEFAULT NULL ,a_long varchar(1024) DEFAULT NULL ,a_float varchar(1024) DEFAULT NULL ,a_double varchar(1024) DEFAULT NULL ,a_datetime varchar(1024) DEFAULT NULL ,a_string_x varchar(1024) DEFAULT NULL ,a_int_x varchar(1024) DEFAULT NULL ,a_boolean_x varchar(1024) DEFAULT NULL ,a_long_x varchar(1024) DEFAULT NULL ,a_float_x varchar(1024) DEFAULT NULL ,a_double_x varchar(1024) DEFAULT NULL ,a_datetime_x varchar(1024) DEFAULT NULL ,a_zero varchar(1024) DEFAULT NULL,c_nested varchar(1024) DEFAULT NULL )ENGINE=InnoDB DEFAULT CHARSET=utf8;"

mysql中語句如下:


 CREATE TABLE IF NOT EXISTS `view63_tbl`(

   `centerlat` decimal(10,7) DEFAULT NULL,

   `c_uuid` VARCHAR(36) DEFAULT NULL ,

   `centerlong` decimal(10,7) DEFAULT NULL,

   `c_month_z`  varchar(6) DEFAULT NULL,

   `c_month_e` varchar(15) DEFAULT NULL,

   `c_province` varchar(25) DEFAULT NULL,

   `c_province_lat_float` float(15,7) DEFAULT NULL,

   `c_province_long_float` float(20,10) DEFAULT NULL,

   `c_province_lat_str` varchar(15) DEFAULT NULL,

   `c_province_long_str` varchar(20) DEFAULT NULL,

   `c_city_suffix` VARCHAR(30)  DEFAULT NULL ,

   `c_suffix` VARCHAR(30)  DEFAULT NULL ,

   `c_am_pm` VARCHAR(10)  DEFAULT NULL,

   `c_phone_prefix` VARCHAR(15)  DEFAULT NULL,

   `c_int` int(11) DEFAULT NULL ,

   `c_long` bigint(40) DEFAULT NULL ,

   `c_boolean` tinyint(1) DEFAULT NULL,

   `c_text` text,

   `c_date_time` datetime(3),

   `c_float` float(10,7) DEFAULT NULL ,

   `c_double` double(20,18) DEFAULT NULL ,

   `a_string` varchar(1024) DEFAULT NULL ,

   `a_int` varchar(1024) DEFAULT NULL ,

   `a_boolean` varchar(1024) DEFAULT NULL  ,

   `a_long` varchar(1024) DEFAULT NULL ,

   `a_float` varchar(1024) DEFAULT NULL ,

   `a_double` varchar(1024) DEFAULT NULL  ,

   `a_datetime` varchar(1024) DEFAULT NULL ,

   `a_string_x` varchar(1024) DEFAULT NULL ,

   `a_int_x` varchar(1024) DEFAULT NULL ,

   `a_boolean_x` varchar(1024) DEFAULT NULL ,

   `a_long_x` varchar(1024) DEFAULT NULL ,

   `a_float_x` varchar(1024) DEFAULT NULL ,

   `a_double_x` varchar(1024) DEFAULT NULL ,

   `a_datetime_x`varchar(1024) DEFAULT NULL ,

   `a_zero` varchar(1024) DEFAULT NULL ,

   `c_nested` varchar(1024) DEFAULT NULL
import json
import pymysql
#mysql的數(shù)據(jù)庫連接信息
conn = pymysql.connect(
    #服務(wù)器地址
        host = '10.6.6.38',
    #端口號
        port = 3307,
    #用戶名
        user = 'root',
    #密碼
        passwd = 'xdata123',
    #數(shù)據(jù)庫名稱
        db = 'dpltest',
    #字符編碼格式
        charset = 'utf8',
    )
#設(shè)置游標(biāo),進(jìn)行數(shù)據(jù)庫操作
cur = conn.cursor()
#創(chuàng)建表語句
#sql = "CREATE TABLE view63_tbl12(centerlat decimal(10,7) DEFAULT NULL,c_uuid VARCHAR(36) DEFAULT NULL ,centerlong decimal(10,7) DEFAULT NULL,c_month_z  varchar(6) DEFAULT NULL,c_month_e varchar(15) DEFAULT NULL,c_province varchar(25) DEFAULT NULL, c_province_lat_float float(15,7) DEFAULT NULL,c_province_long_float float(20,10) DEFAULT NULL,c_province_lat_str varchar(15) DEFAULT NULL,c_province_long_str varchar(20) DEFAULT NULL,c_city_suffix VARCHAR(30)  DEFAULT NULL ,c_suffix VARCHAR(30)  DEFAULT NULL ,c_am_pm VARCHAR(10)  DEFAULT NULL,c_phone_prefix VARCHAR(15)  DEFAULT NULL,c_int int(11) DEFAULT NULL ,c_long bigint(40) DEFAULT NULL ,c_boolean tinyint(1) DEFAULT NULL, c_text text,c_date_time datetime(3),c_float float(10,7) DEFAULT NULL ,c_double double(20,18) DEFAULT NULL ,a_string varchar(1024) DEFAULT NULL ,a_int varchar(1024) DEFAULT NULL ,a_boolean varchar(1024) DEFAULT NULL  ,a_long varchar(1024) DEFAULT NULL ,a_float varchar(1024) DEFAULT NULL ,a_double varchar(1024) DEFAULT NULL  ,a_datetime varchar(1024) DEFAULT NULL ,a_string_x varchar(1024) DEFAULT NULL ,a_int_x varchar(1024) DEFAULT NULL ,a_boolean_x varchar(1024) DEFAULT NULL ,a_long_x varchar(1024) DEFAULT NULL ,a_float_x varchar(1024) DEFAULT NULL ,a_double_x varchar(1024) DEFAULT NULL ,a_datetime_x varchar(1024) DEFAULT NULL ,a_zero varchar(1024) DEFAULT NULL,c_nested varchar(1024) DEFAULT NULL )ENGINE=InnoDB DEFAULT CHARSET=utf8;"
#cur.execute(sql)

使用有游標(biāo)執(zhí)行sql語句可完成cur.execute(sql),mysql中的表結(jié)構(gòu)需要跟json中的表結(jié)構(gòu)一致才可以,也就是json中的key的值

創(chuàng)建好表以后,需要往表里面導(dǎo)入數(shù)據(jù)了,怎么導(dǎo)入呢,通過json文件方式進(jìn)行導(dǎo)入

#打開文件
#設(shè)置讀取的路徑
path1 = "D:/work/python/aus_dpl_v62_td.json"
with open(path1, 'r', encoding='utf_8_sig') as f:

    ln=0

    #逐行讀取

    for line in f.readlines():

        ln +=1

需要將讀過來的數(shù)據(jù)轉(zhuǎn)化成字典進(jìn)行存儲, dic = json.loads(line)

  #以,進(jìn)行key的拼接,對應(yīng)json中的字段

        keys = ', '.join(dic.keys())

json數(shù)據(jù)里面有些是list形式,這種無法導(dǎo)入,需要將其轉(zhuǎn)化成str形式,才能導(dǎo)入

 # value=dic.values()
        # 循環(huán) dic.values() 如果類型是list或dict 轉(zhuǎn)為str 
        #print(type(dic.values()))
        print(keys)
        #將字典value信息存儲成list
        valuesList = [dici for dici in dic.values()]
        #進(jìn)行List列表的遍歷
        for index1, value1 in enumerate(valuesList):
#             print(type(value1), value1)
        #如果是list,將其以str類型存儲
            if isinstance(value1, list):
               # print(value1)
                valuesList[index1] = str(value1)

思路是將values進(jìn)行類型循環(huán),真?zhèn)€values的list進(jìn)行遍歷,如果是list類型,就將其轉(zhuǎn)化為str存儲
然后將其轉(zhuǎn)化為元組形式存儲
將value的值用,進(jìn)行拼接,用于插入數(shù)據(jù)用

#將str類型轉(zhuǎn)化成元組形式存儲
        valuesTuple = tuple(valuesList)
#         print((valuesTuple))
       # strdata=json.dumps(data)
    #將value值進(jìn)行拼接
        values = ', '.join(['%s']*len(dic)) 

進(jìn)行插入數(shù)據(jù)的執(zhí)行

table="view63_tbl"
        #構(gòu)造sql插入語句
        sql = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table=table, keys=keys, values=values)  
#         print(sql)
        #執(zhí)行sql語句
        cur.execute(sql,valuesTuple)
        conn.commit()
conn.close()

整體代碼如下:

import json
import pymysql
#mysql的數(shù)據(jù)庫連接信息
conn = pymysql.connect(
    #服務(wù)器地址
        host = '10.6.6.38',
    #端口號
        port = 3307,
    #用戶名
        user = 'root',
    #密碼
        passwd = 'xdata123',
    #數(shù)據(jù)庫名稱
        db = 'dpltest',
    #字符編碼格式
        charset = 'utf8',
    )
#設(shè)置游標(biāo),進(jìn)行數(shù)據(jù)庫操作
cur = conn.cursor()
#創(chuàng)建表語句
#sql = "CREATE TABLE view63_tbl12(centerlat decimal(10,7) DEFAULT NULL,c_uuid VARCHAR(36) DEFAULT NULL ,centerlong decimal(10,7) DEFAULT NULL,c_month_z  varchar(6) DEFAULT NULL,c_month_e varchar(15) DEFAULT NULL,c_province varchar(25) DEFAULT NULL, c_province_lat_float float(15,7) DEFAULT NULL,c_province_long_float float(20,10) DEFAULT NULL,c_province_lat_str varchar(15) DEFAULT NULL,c_province_long_str varchar(20) DEFAULT NULL,c_city_suffix VARCHAR(30)  DEFAULT NULL ,c_suffix VARCHAR(30)  DEFAULT NULL ,c_am_pm VARCHAR(10)  DEFAULT NULL,c_phone_prefix VARCHAR(15)  DEFAULT NULL,c_int int(11) DEFAULT NULL ,c_long bigint(40) DEFAULT NULL ,c_boolean tinyint(1) DEFAULT NULL, c_text text,c_date_time datetime(3),c_float float(10,7) DEFAULT NULL ,c_double double(20,18) DEFAULT NULL ,a_string varchar(1024) DEFAULT NULL ,a_int varchar(1024) DEFAULT NULL ,a_boolean varchar(1024) DEFAULT NULL  ,a_long varchar(1024) DEFAULT NULL ,a_float varchar(1024) DEFAULT NULL ,a_double varchar(1024) DEFAULT NULL  ,a_datetime varchar(1024) DEFAULT NULL ,a_string_x varchar(1024) DEFAULT NULL ,a_int_x varchar(1024) DEFAULT NULL ,a_boolean_x varchar(1024) DEFAULT NULL ,a_long_x varchar(1024) DEFAULT NULL ,a_float_x varchar(1024) DEFAULT NULL ,a_double_x varchar(1024) DEFAULT NULL ,a_datetime_x varchar(1024) DEFAULT NULL ,a_zero varchar(1024) DEFAULT NULL,c_nested varchar(1024) DEFAULT NULL )ENGINE=InnoDB DEFAULT CHARSET=utf8;"
#cur.execute(sql)
#json文件讀取路徑
path1 = "D:/work/python/aus_dpl_v62_td.json"
#打開文件
with open(path1, 'r', encoding='utf_8_sig') as f:
    ln=0
    #逐行讀取
    for line in f.readlines():
        ln +=1
        #將數(shù)據(jù)轉(zhuǎn)化為字典形式存儲
        dic = json.loads(line)
        #keys=dic.keys()
        #以,進(jìn)行key的拼接,對應(yīng)json中的字段
        keys = ', '.join(dic.keys())
       # value=dic.values()
        # 循環(huán) dic.values() 如果類型是list或dict 轉(zhuǎn)為str 
        #print(type(dic.values()))
        print(keys)
        #將字典value信息存儲成list
        valuesList = [dici for dici in dic.values()]
        #進(jìn)行List列表的遍歷
        for index1, value1 in enumerate(valuesList):
#             print(type(value1), value1)
        #如果是list,將其以str類型存儲
            if isinstance(value1, list):
               # print(value1)
                valuesList[index1] = str(value1)
    #將str類型轉(zhuǎn)化成元組形式存儲
        valuesTuple = tuple(valuesList)
#         print((valuesTuple))
       # strdata=json.dumps(data)
    #將value值進(jìn)行拼接
        values = ', '.join(['%s']*len(dic)) 
       # print(values)
    #設(shè)置表名稱
        table="view63_tbl"
        #構(gòu)造sql插入語句
        sql = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table=table, keys=keys, values=values)  
#         print(sql)
        #執(zhí)行sql語句
        cur.execute(sql,valuesTuple)
        conn.commit()
conn.close()

導(dǎo)入界面如下


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容