JSON(JavaScript Object Notation)是一种轻量级数据交换格式,相对于XML而言更简单,也易于阅读和编写,机器也方便解析和生成,Json是JavaScript中的一个子集。
json 模块提供了一种很简单的方式来编码和解码JSON数据。 其中两个主要的函数是 json.dumps() 和 json.loads() ,对于本地数据,python就是使用json模块直接dumps(data)和loads(str)罗,对于文件是dump(data,file)和load(file)。 JSON编码支持基本类型为None,bool,int,float,它要比其他序列化函数库如pickle的接口少得多。 下面是官方给出的示例
#python数据结构转换为json
import json
data = {
'name' : 'ACME',
'shares' : 100,
'price' : 542.23
}
json_str = json.dumps(data)
#JSON编码的字符串转换回一个Python数据结构
data = json.loads(json_str)
#如果你要处理的是文件而不是字符串,你可以使用 json.dump() 和 json.load() 来编码和解码JSON数据。
# Writing JSON data
with open('data.json', 'w') as f:
json.dump(data, f)
# Reading data back
with open('data.json', 'r') as f:
data = json.load(f)
因为小编也是最近因为实验室的小练习接触到json格式的转换,在学习爬虫的过程中,用scrapy框架对德州扑克的标签页数据进行了爬取并分别存了mysql数据库和json文件,类似这样:
json.png
mysql.png
后端方面的同学觉得数据不好取,所以得分层存取,比如每个数据单元的title是从A-Z开头的,这里将首字母取出作为一个大标题在外面,其中再次存成一个json段,类似
{
"A":{
title": "A-Game", "describe_title": "最佳状态",
title": "A-ame", "describe_title": "最佳"
}
}
然后就开始各种斗智斗勇,主要还是利用字典嵌套,这里用到了python的chr函数,chr() 用一个范围在 range(256)内的(就是0~255)整数作参数,返回一个对应的字符。例如:
GN{%TLQMD8O3ON%49EW}U5N.png
这里利用chr函数取出首字母作为标题,利用字典嵌套,将已有字典添加到空字典之后并执行输出,逻辑还是比较简单的:
f = open("poker.json", "r", encoding='utf-8')
newarr = {}
dic = json.loads(f.read())
for i in range(65, 91):
arr = []
for line in dic:
if str(line["title"])[0].upper() == chr(i):
arr.append(line)
newarr[chr(i)] = arr
print(newarr)
但但但但但但是,后端是你永远过不去的坎儿,他又发现这样数据太乱,因为json存取文件里面没有格式化,要求直接排好序数据给他就行,所以有了以下2.0版本,直接从mysql里面排好序查询好之后读出数据存进json文件:
# coding=utf-8
'''
Project:读取mysql数据库的数据,转为json格式
'''
import json, pymysql, os
def TableToJson():
try:
# 1.创建mysql数据库连接对象connection
# connection对象支持的方法有cursor(),commit(),rollback(),close()
conn = pymysql.Connect(host='127.0.0.1', user='root', passwd='299521', db='poker_new', port=3306, charset='utf8')
# 2.创建mysql数据库游标对象 cursor
# cursor对象支持的方法有execute(sql语句),fetchone(),fetchmany(size),fetchall(),rowcount,close()
cur = conn.cursor()
# 3.编写sql
sql = "SELECT title, describe_title, describe_content, illustrate_title, illustrate_content, relevant_title, relevant_content, study_title, study_content, url FROM poker_info ORDER BY title"
# 4.执行sql命令
# execute可执行数据库查询select和命令insert,delete,update三种命令(这三种命令需要commit()或rollback())
cur.execute(sql)
# 5.获取数据
# fetchall遍历execute执行的结果集。取execute执行后放在缓冲区的数据,遍历结果,返回数据。
# 返回的数据类型是元组类型,每个条数据元素为元组类型:(('第一条数据的字段1的值','第一条数据的字段2的值',...,'第一条数据的字段N的值'),(第二条数据),...,(第N条数据))
data = cur.fetchall()
# 6.关闭cursor
cur.close()
# 7.关闭connection
conn.close()
jsonData = []
# 循环读取元组数据
# 将元组数据转换为列表类型,每个条数据元素为字典类型:[{'字段1':'字段1的值','字段2':'字段2的值',...,'字段N:字段N的值'},{第二条数据},...,{第N条数据}]
for row in data:
result = {}
result['title'] = row[0]
result['describe_title'] = row[1]
result['describe_content'] = row[2]
result['illustrate_title'] = row[3]
result['illustrate_content'] = row[4]
result['relevant_title'] = row[5]
result['relevant_content'] = row[6]
result['study_title'] = row[7]
result['study_content'] = row[8]
result['url'] = str(row[9])
jsonData.append(result)
print("转换为列表字典的原始数据:", jsonData)
except:
print("error")
# 'MySQL connect fail...'
else:
# 使用json.dumps将数据转换为json格式,json.dumps方法默认会输出成这种格式"\u5377\u76ae\u6298\u6263",加ensure_ascii=False,则能够防止中文乱码。
# JSON采用完全独立于语言的文本格式,事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。
# json.dumps()是将原始数据转为json(其中单引号会变为双引号),而json.loads()是将json转为原始数据。
jsondatar = json.dumps(jsonData, ensure_ascii=False)
# 去除首尾的中括号
return jsondatar[1:len(jsondatar) - 1]
if __name__ == '__main__':
# 调用函数
jsonData = TableToJson()
print(jsonData)#u'转换为json格式的数据:', jsonData
# 以读写方式w+打开文件,路径前加r,防止字符转义
f = open(os.getcwd()+'\jobs.json', 'w+', encoding='utf-8')
# 写数据
f.write(jsonData)
# 关闭文件
f.close()
有关python的文件读写也可以参考[python文档](https://python3-- --
cookbook.readthedocs.io/zh_CN/latest/preface.html),我之后的文章也会进行更新,敬请期待
- 详情代码可以参考github
网友评论