python json及mysql——讀取json檔案存sql、資料庫日期類型轉換、終端操縱mysql及python codecs讀取大檔案問題

來源:互聯網
上載者:User

標籤:json對象   編寫   snippet   python2   sel   connect   ast   程式猿   轉換   

preface: 近期幫師兄處理json檔案,須要讀到資料庫裡面,以備其興許從資料庫讀取資料。資料是關於yelp網站裡面的: https://github.com/Yelp/dataset-examples,http://www.yelp.com/dataset_challenge/. 涉及到一些json和sql的問題,記錄下。

一、python sql安裝

python 內建輕型資料庫sqlite,只是用不了。須要mysql才行。pip安裝mysql失敗。easy_install安裝也失敗。這不科學。

後經過同仁的幫忙。用conda成功安裝,這什麼鬼。好吧。查了下是python內建的包管理器conda

pip install MySQLdbeasy_install MySQLdbpip install MySQLeasy_install MySQLipythonwhich pythonsudo conda search mysqlconda search mysqlconda install mysql-python

二、處理json資料

python有內建解析json的包,如同解析html的beautifulsoup, 解析xml的xml包等等。用json.loads()函數可破。下面幾句代碼可破。

import jsonimport codecsf = codecs.open(file_name,encoding = "utf-8")for line in f:    line = line.strip("\n")    line_dict = json.loads(line)
須要注意的是:

1.鹵主用的是codecs讀入檔案。以前以為

with codecs.open(file_name,encoding = "utf-8") as f:    text = f.readlines()

通過readlines()是一行一行的讀入,可是這次遇到1.4G的json檔案時。記憶體溢出。轉為直接用上面的,而非用readlines()函數讀。

2.json.loads()傳入的參數須要是json字串。鹵主一行一行的讀入,傳入json字串,解析後。是一個字典。接下來就優點理了。看個人須要進行分析。

#============================

方法2:將整個json檔案作為參數傳入到

f = file(file_name)

s = json.load(f)

但這樣會遇到ValueError:Extra data錯誤,查了下資料,說是多個json對象的問題。這不廢話麼。一個目錄裡肯定多個json對象。stackoverflow裡面解釋的非常具體http://stackoverflow.com/questions/21058935/python-json-loads-shows-valueerror-extra-data。


>>> json.loads('{}'){}>>> json.loads('{}{}') # == json.loads(json.dumps({}) + json.dumps({}))Traceback (most recent call last):  File "<stdin>", line 1, in <module>  File "C:\Python27\lib\json\__init__.py", line 338, in loads    return _default_decoder.decode(s)  File "C:\Python27\lib\json\decoder.py", line 368, in decode    raise ValueError(errmsg("Extra data", s, end, len(s)))ValueError: Extra data: line 1 column 3 - line 1 column 5 (char 2 - 4)>>> dict1 = {}>>> dict2 = {}>>> json.dumps([dict1, dict2])'[{}, {}]'>>> json.loads(json.dumps([dict1, dict2]))[{}, {}]

鹵主沒用方法2。故沒有深究。

三、存sql

一開始沒試過。等真正尋找部落格編寫自己的代碼的時候比自己想象的簡單。直接上有凝視的代碼。


import MySQLdb as mdb#須要建立資料庫yelp_dataset_challenge_academic_daasetconn = mdb.connect(host = 'XXX.XX.XX.XX', user = 'XXX', passwd = 'XX', db = 'yelp_dataset_challenge_academic_daaset')cur  = conn.cursor()#初始化遊標#conn.set_character_set("utf-8")cur.execute('SET NAMES utf8;') cur.execute('SET CHARACTER SET utf8;')cur.execute('SET character_set_connection=utf8;')#===============建表,先刪除已存在的記錄。

表本身不刪除。不用drop,用deletetable_name = "yelp_academic_dataset_checkin"delete_table = "delete from "+table_namecur.execute(delete_table)#須要在資料庫中建立表yelp_academic_dataset_checkin,及欄位和欄位屬性類型。

#寫sql語句建立也行。不insert_sql = "insert into yelp_academic_dataset_checkin (type,business_id,checkin_info) values (%s,%s,%s)"#=====從json得到value的一些步驟,略。============values_tuple = (str(temp_values[0]),str(temp_values[1]),str(temp_values[2]))cur.execute(insert_sql,values_tuple)#運行完了,須要關掉conn.commit()conn.close()



四、寫入日期型資料

需求變。代碼也跟著變。唉。讓一個程式猿崩潰,改三次需求即可。

有個欄位在資料庫裡是date類型,而不是varchar(),python字串到mysql資料庫裡面須要是date類型的,有兩種方法可破,第一,python字串轉為date類型,然後寫到資料庫裡。其二。python字串寫到裡面,再在調用函數轉為date類型,寫到資料庫裡。鹵主用了另外一種方法,用時過多差點吐血。mysql有函數str_to_date(),可協助將字串類型的資料轉為date類型資料。

但注意參數變化。

date_string = "2015-07"name = "shifeng"values_tuple = (name, date_string)insert_sql = "insert into table_name (name_field, date_field) values(%s,str_to_date(%s, "%%Y-%%m"))"cur.execute(insert_sql, values_tuple)
存sql見第三步,這裡主要說明的是str_to_date函數。第一個參數為字串,二個參數個日期的格式,注意格式。注意格式,注意格式(重要的事情要說三遍)。字串是四位元的年齡加杠符號加兩位元的月份。那麼str_to_date函數第二個參數須要是百分比符號加Y加杠符號加百分比符號加m的字串,假設字串裡的杠是逗號。那麼第二個參數裡面也相應的是逗號,另外,這裡有兩個百分比符號。是由於python須要轉義,若是直接在mysql裡面操作的時候直接:

insert into table_name(name_field, date_field) values("shifeng", str_to_date("2015-07","%Y-%m"))
就可以。


五、終端操縱mysql

首先下載mysql

sudo apt-get install mysql-client

其次。連上資料庫

mysql -h XX.XX.XX.XX -u user_name password database_name

接下來可做一些操作如同在資料中命令的操作:

show tables;select * from table_name;insert into table_name(name_field, date_field) values("shifeng", str_to_date("2015-07","%Y-%m"))delete from table_name;

另外似乎能夠json--->dataframe--->sql,用pandas.io.json相關的。鹵主沒有試過,以後有機會能夠一試。

參考:

1.https://github.com/Yelp/dataset-examples

2.http://www.yelp.com/dataset_challenge/

3.http://stackoverflow.com/questions/21058935/python-json-loads-shows-valueerror-extra-data

python json及mysql——讀取json檔案存sql、資料庫日期類型轉換、終端操縱mysql及python codecs讀取大檔案問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.