python json及mysql——讀取json文件存sql、數據庫日期類型轉換、終端操縱mysql及python codecs讀取大文件問題
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 MySQLdb easy_install MySQLdb pip install MySQL easy_install MySQL ipython which python sudo conda search mysql conda search mysql conda install mysql-python
二、處理json數據
python有自帶解析json的包,如同解析html的beautifulsoup, 解析xml的xml包等等。用json.loads()函數可破。下面幾句代碼可破。
import json import codecs f = 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_daaset conn = 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,用delete table_name = "yelp_academic_dataset_checkin" delete_table = "delete from "+table_name cur.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讀取大文件問題