python安装包(这里我们只需要安装python2.7的那个版本):
https://pan.baidu.com/s/14cJmOMnhvCrGGoikzU1SLA 密码:uyne
honglou.json源代码及生成的.csv文件:
https://pan.baidu.com/s/1UTKn4KvmMeU7tIrucGsxZA 密码:3e1n
原理:
总体思路:就是通过了解.json数据结构与我们需要生成的.csv文件结构来编写python代码
1了解.json数据结构
{
"categories": {
"person": "人物",
"event": "事件",
"location": "地点"
},
"data": {
"nodes": [{
"label": "共读西厢",
"value": 2,
"id": 3779,
"categories": [
"event"
],
"info": "宝玉到沁芳桥边桃花底下看《西厢记》,正准备将落花送进池中,黛玉说她早已准备了一个花冢,正来葬花。黛玉发现《西厢记》,宝玉借书中词句,向黛玉表白。黛玉觉得冒犯了自己尊严,引起口角,宝玉赔礼讨饶,黛玉也借《西厢记》词句,嘲笑了宝玉。于是两人收拾落花,葬到花冢里去。"
},
... ...
2.编写解析程序,写入节点及边文件
节点文件
id,value,category,label,info
3779,2,event,共读西厢,"宝玉到沁芳桥边桃花底下看《西厢记》,正准备将落花送进池中,黛玉说她早已准备了一个花冢,正来葬花。黛玉发现《西厢记》,宝玉借书中词句,向黛玉表白。黛玉觉得冒犯了自己尊严,引起口角,宝玉赔礼讨饶,黛玉也借《西厢记》词句,嘲笑了宝玉。于是两人收拾落花,葬到花冢里去。"
3780,4,event,林如海捐馆扬州城,"林如海考中探花后,迁为兰台寺大夫,钦点为扬州巡盐御史。后身染重病于九月初三日巳时而亡。"
边文件
source,target,label
3838,3851,"位于"
3839,3851,"位于"
3840,3851,"位于"
3841,3851,"位于"
3842,3851,"位于"
3843,3856,"位于"
3844,3851,"位于"
3845,3851,"位于"
python安装及运行
# coding:UTF-8
import json
import codecs
# 打开需要解析的文件
file = open('honglou.json 路径')
# 创建需要写入的文件
nodeFile = codecs.open('honglou_node.csv 保存的路径', 'w+', 'utf-8')
edgeFile = codecs.open('honglou_edge.csv 保存的路径', 'w+', 'utf-8')
# 写入表头
nodeFile.writelines('id,value,category,label,info\n')
edgeFile.writelines('source,target,label\n')
# 将原始文件读如lines变量
lines = json.load(file)
# 从lines变量中读取所有的节点数据
nodes = lines['data']['nodes']
for node in nodes:
nodeFile.writelines(str(node['id']) + ',' + str(node['value'])
+ ',' + node['categories'][0]
+ ',' + node['label'] + ','
+ json.dumps(node['info'], ensure_ascii=False)
+ '\n')
# 从lines变量中读取所有的边数据
edges = lines['data']['edges']
for edge in edges:
edgeFile.writelines(str(edge['from']) + ','
+ str(edge['to']) + ','
+ json.dumps(edge['label'], ensure_ascii=False) + '\n')
file.close()
nodeFile.close()
edgeFile.close()
操作截图:
前后对比:
对以上代码两个库的理解:
Json:
Json,全名 JavaScript Object Notation,是一种轻量级的数据交换格式。
函数 描述 json.loads 将已编码的 JSON 字符串解码为 Python 对象
json.dumps 将 Python 对象编码成 JSON 字符串
eg:
>>> s = '{"age": 30, "name": "bluejoe"}'
>>> o = json.loads(s)
>>> o['age']+=10
>>> json.dumps(o)
'{"age": 40, "name": "bluejoe"}'
用水平时间图表示他们的关系:
eodecs:
字符的编码是按照某种规则在单字节字符和多字节字符之间进行转换的某种方法。从单字节到多字节叫做decoding,从多字节到单字节叫做 encoding。在这些规则中经常用到的无非是UTF-8和GB2312两种。
在Python中,codecs模块提供了实现这些规则的方法,通过模块公开的方法我们能够方便地获取某种编码方式的Encoder和 Decoder工厂函数(Factory function),以及StreamReader、StreamWriter和StreamReaderWriter类。
用水平时间图表示eodecs作用: