最近看代码,又有看不懂的地方了,在此mark一下: 总体
编码:把一个Python对象编码转换成Json字符串 json.dumps( )
解码:把Json格式字符串解码转换成Python对象 json.loads( )
话不多说,看代码块:
加载json文件:
def load_json(path):
import json
'''
读取配置文件,并过滤掉以//开头的注释
'''
lines=[] #将内容读入lines这个list
with open(path) as f:
for row in f.readlines():
if row.strip().startswith("//"):
continue
lines.append(row)
return json.loads("\n".join(lines))
#输出lines的结构发现如下:
['\n', '{\n', '"dataset":{\n', ' "train": {"type": "mnist", "data_set": "train", "layout_x": "tensor"},\n', ' "test": {"type": "mnist", "data_set": "test", "layout_x": "tensor"}\n', '},\n'
line的每一行都包含了换行符\n,原文本的每一行在lines这个列表中为单引号包含的每一行内容,每个元素间用逗号分隔。
我们来说一下Python中string.join()这个函数
join(): 连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串
1、join( )函数
语法: ‘sep’.join(seq)
参数说明
sep:分隔符。可以为空
seq:要连接的元素序列、字符串、元组、字典
上面的语法即:以sep作为分隔符,将seq所有的元素合并成一个新的字符串
返回值:返回一个以分隔符sep连接各个元素后生成的字符串
参考网址:https://www.cnblogs.com/jsplyy/p/5634640.html
参考网址:https://www.cnblogs.com/SkySoot/archive/2012/04/17/2453010.html
那么(“\n”.join(lines))后的输出的形式为。中间多了每个元素之间多了一个换行,其实这里“\n”和“”都可以,因为在json.loads(“\n”.join(lines)) 和json.loads(“”.join(lines)) 这两个是等效的。
t=”\n”.join(lines)之后的输出是:
可以看到经过”\n”.join(lines)之后,把它绑定到一个变量t,变量的类型是str,然后result=json.loads(t)之后,result的类型就是python的dict类型。
{
"dataset":{
"train": {"type": "mnist", "data_set": "train", "layout_x": "tensor"},
"test": {"type": "mnist", "data_set": "test", "layout_x": "tensor"}
},
"train":{
"keep_model_in_mem":0,
"random_state":0,
"data_cache":{
"cache_in_disk":{
"default":1
},
"keep_in_mem":{
"default":0
},
"cache_dir":"/home/zhaopanpan/gcForest-master/result/mnist/fg-tree500-depth100-3folds/datas"
}
}
}
那么这个程序的逻辑就是将配置文件转化为符合json格式的字符串(str),然后用json.loads(str)将符合json格式的字符串转化为python的字典对象。那么什么是符合json格式的字符串,json.loads(str)又是怎么样将str字符串转化为python字典对象的呢?下面我们来谈论这个问题。
json的两种结构
python的dict的两种结构
json两种结构与python相应类型的转化
if __name__ == '__main__':
args = parse_args()
# In this case ,refer to
# models/mnist/gcforest/fg-tree500-depth100-3folds.json
config = load_json(args.model)
update_default_level(logging.DEBUG)
if args.log_dir is not None:
update_default_logging_dir(args.log_dir)
from gcforest.fgnet import FGNet, FGTrainConfig
from gcforest.exp_utils import prec_ets, prec_rf, prec_log, prec_xgb, concat_datas
from gcforest.datasets import get_dataset
# 这个 LOGGER = get_logger("tools.train_fg")中tools.train_fg是由gcforest.utils.log_utils中的get_logger创建
LOGGER = get_logger("tools.train_fg")
LOGGER.info("tools.train_fg")
# json.dumps将 Python 对象编码成 JSON 字符串
LOGGER.info("\n" + json.dumps(config, sort_keys=True, indent=4, separators=(',', ':'))) # indent是缩进的意思
用于排错的网址:https://www.tuicool.com/articles/YBnE3q