代码理解json.loads()和json.dumps(config, sort_keys=True, indent=4, separators=(',', ':')

最近看代码,又有看不懂的地方了,在此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)之后的输出是:
变量result是json.loads(t)作用t之后的详细信息,t是
可以看到经过”\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是缩进的意思 

相关知识点:

  • Skipkeys:默认值是False,如果dict的keys内的数据不是python的基本类型(str,unicode,int,long,float,bool,None),设置为False时,就会报TypeError的错误。此时设置成True,则会跳过这类key
  • ensure_ascii:默认值True,如果dict内含有non-ASCII的字符,则会类似\uXXXX的显示数据,设置成False后,就能正常显示
  • indent:应该是一个非负的整型,如果是0,或者为空,则一行显示数据,否则会换行且按照indent的数量显示前面的空白,这样打印出来的json数据也叫pretty-printed json
  • separators:分隔符,实际上是(item_separator, dict_separator)的一个元组,默认的就是(‘,’,’:’);这表示dictionary内keys之间用“,”隔开,而KEY和value之间用“:”隔开。
  • encoding:默认是UTF-8,设置json数据的编码方式。
  • sort_keys:将数据根据keys的值进行排序。

用于排错的网址:https://www.tuicool.com/articles/YBnE3q

你可能感兴趣的:(json)