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读取大文件问题的更多相关文章

  1. SQLLite 可以通过SQL语言来访问的文件型SQL数据库

    Web Storage分为两类: - sessionStorage:数据保存在session 对象中(临时) - localStorage:数据保存在本地硬件设备中(永久) sessionStorag ...

  2. VB中上传下载文件到SQL数据库

    VB中上传下载文件到SQL数据库 编写人:左丘文 2015-4-11 近期在修改一个VB编写的系统时,想给画面增加一个上传文件到数据库,并可以下载查看的功能,今天在这里,我想与大家一起分享代码,在此做 ...

  3. SQL反模式学习笔记12 存储图片或其他多媒体大文件

    目标:存储图片或其他多媒体大文件 反模式:图片存储在数据库外的文件系统中,数据库表中存储文件的对应的路径和名称. 缺点:     1.文件不支持Delete操作.使用SQL语句删除一条记录时,对应的文 ...

  4. 将csv文件导入sql数据库

    有一个csv文件需要导入到Sql数据库中,其格式为 “adb”,"dds","sdf" “adb”,"dds","sdf" ...

  5. InstallShield在MySQL和Oracle中执行SQL脚本的方法InstallShield在MySQL和Oracle中执行SQL脚本的方法

    简述 InstallShield已经内建了对MySQL和Oracle的支持.但是这个功能是通过ODBC实现的,它对SQL脚本的格式要求非常严格,因此已经通过官方客户端测试的脚本在IS中执行时往往就会报 ...

  6. sql数据库不能用localhost/phpMyadmin登陆,真正要修改的文件是哪个

    今天,数据库抽风,在地址栏输入localhost/phpmyadmin尽然显示没有访问权限的英文....查了资料都是有好多解决方案,基本都是先点击绿色的w图标,然后找到apache下的httpd.co ...

  7. 根据.MDF文件查看 SQL数据库的版本信息

    http://www.cnblogs.com/eason-chan/p/3695753.html?utm_source=tuicool 手上有 经理带来的一个教学管理系统,由于不知道开发环境,在向SQ ...

  8. 还原没有日志文件的SQL数据库

    1.执行命令示例: EXEC sys.sp_attach_db @dbname = 'AdventrueWorks2012_Data',     @filename1 = N'C:\Program F ...

  9. 存储库之mongodb,redis,mysql

    一.简介 MongoDB是一款强大.灵活.且易于扩展的通用型数据库 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性 ...

随机推荐

  1. django开发微信公众平台遇到的问题记录

    在pythonanywhere.com上使用django开发微信公众平台应用,结果用户发送的信息,微信服务器一次也没有成功转发到pythonanywhere上来,但是用接口测试工具调试却发现是正常的, ...

  2. js常用特效-幻灯片

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. UVA 11404 Palindromic Subsequence

    Palindromic Subsequence Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVA ...

  4. 设计模式实例(Lua)笔记之七(Decorator模式)

    1.描写叙述 就说说"我"上小学的的糗事吧. 我上小学的时候学习成绩非常的差,班级上 40 多个同学,我基本上都是在排名 45 名以后,依照老师给我的定义就是"不是读书的 ...

  5. 练练脑,继续过Hard题目

    http://www.cnblogs.com/charlesblc/p/6384132.html 继续过Hard模式的题目吧.   # Title Editorial Acceptance Diffi ...

  6. HDU 4035

    dp求期望的题. 设 E[i]表示在结点i处,要走出迷宫所要走的边数的期望.E[1]即为所求. 叶子结点: E[i] = ki*E[1] + ei*0 + (1-ki-ei)*(E[father[i] ...

  7. Android动态加载字节码

    概述 面对App业务逻辑的频繁变更,如果每一次改变都对App进行一次升级,会降低App的用户体验,那么App进行模块化升级(这里与增量升级是不同的)是很好的解决方案,让用户在完全无感觉的情况下改变Ap ...

  8. 简单来说一下java中的泛型,ssh中dao层使用会简化代码量

    原来仅仅是听老师说泛型特别好用,但是后来一直弄android用的泛型就比較少了.但是感觉它真的非常重要,于是花了一下午的时间写了个demo.好,老规矩.上代码: 首先,sysout是个工具,可是用着不 ...

  9. Dalvik虚拟机垃圾收集(GC)过程分析

    前面我们分析了Dalvik虚拟机堆的创建过程,以及Java对象在堆上的分配过程. 这些知识都是理解Dalvik虚拟机垃圾收集过程的基础.垃圾收集是一个复杂的过程,它要将那些不再被引用的对象进行回收.一 ...

  10. Hadoop实战:使用Combiner提高Map/Reduce程序效率

    好不easy算法搞定了.小数据測试也得到了非常好的结果,但是扔到进群上.挂上大数据就挂了.无休止的reduce不会结束了. .. .. .... .. ... .. ================= ...