您的位置:首页 > 编程语言 > Python开发

python json及mysql——读取json文件存sql、数据库日期类型转换、终端操纵mysql及python codecs读取大文件问题

2015-07-04 10:05 1141 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  conda mysql yelp sqlite