python存储和读取数据时出现错误_python读取json文件存sql及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 "", line 1, in

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 = '', 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()

另外似乎可以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

版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值