最近在python里面用json读取json文件,可是老是不成功,特此记录一下。

预备知识:

def load(fp, cls=None, object_hook=None, parse_float=None,
        parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
    """Deserialize ``fp`` (a ``.read()``-supporting file-like object containing
    a JSON document) to a Python object."""
def loads(s, encoding=None, cls=None, object_hook=None, parse_float=None,
        parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
    """Deserialize ``s`` (a ``str`` instance containing a JSON
    document) to a Python object."""

其实我刚刚看json.load()和json.loads()代码定义的时候,也不知道什么是文件类型。什么是字符串类型,用python的type函数看一下就好了
例如:

with open("文件名") as f:
     print(type(f))  # <class '_io.TextIOWrapper'>  也就是文本IO类型
     result=json.load(f)
with open("文件名") as f:
    line=f.readline():  
    print(type(line))  # <class 'str'>
    result=json.loads(line)

从以上可以看出json.load()是用来读取文件的,即,将文件打开然后就可以直接读取。示例如下:

with open("文件名") as f:
     result=json.load(f)

json.loads()是用来读取字符串的,即,可以把文件打开,用readline()读取一行,然后json.loads()一行。示例如下:

#json文件为:
{"outputs": ["pool1/7x7/ets", "pool1/7x7/rf", "pool1/10x10/ets", "pool1/10x10/rf", "pool1/13x13/ets", "pool1/13x13/rf"]}

读取代码如下:

with open("文件名") as f:
    line=f.readline():
    result=json.loads(line)

当json文件如下时,读取内容是错误的:

"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":"/mnt/raid/fengji/gcforest/mnist/fg-tree500-depth100-3folds/datas" "net":{ "outputs": ["pool1/7x7/ets", "pool1/7x7/rf", "pool1/10x10/ets", "pool1/10x10/rf", "pool1/13x13/ets", "pool1/13x13/rf"], "layers":[ "type":"FGWinLayer", "name":"win1/7x7", "bottoms": ["X","y"], "tops":["win1/7x7/ets", "win1/7x7/rf"], "n_classes": 124, "estimators": [ {"n_folds":3,"type":"ExtraTreesClassifier","n_estimators":500,"max_depth":100,"n_jobs":-1,"min_samples_leaf":10}, {"n_folds":3,"type":"RandomForestClassifier","n_estimators":500,"max_depth":100,"n_jobs":-1,"min_samples_leaf":10} "stride_x": 2, "stride_y": 2, "win_x":7, "win_y":7 "type":"FGWinLayer", "name":"win1/10x10", "bottoms": ["X","y"], "tops":["win1/10x10/ets", "win1/10x10/rf"], "n_classes": 10, "estimators": [ {"n_folds":3,"type":"ExtraTreesClassifier","n_estimators":500,"max_depth":100,"n_jobs":-1,"min_samples_leaf":10}, {"n_folds":3,"type":"RandomForestClassifier","n_estimators":500,"max_depth":100,"n_jobs":-1,"min_samples_leaf":10} "stride_x": 2, "stride_y": 2, "win_x":10, "win_y":10 "type":"FGWinLayer", "name":"win1/13x13", "bottoms": ["X","y"], "tops":["win1/13x13/ets", "win1/13x13/rf"], "n_classes": 10, "estimators": [ {"n_folds":3,"type":"ExtraTreesClassifier","n_estimators":500,"max_depth":100,"n_jobs":-1,"min_samples_leaf":10}, {"n_folds":3,"type":"RandomForestClassifier","n_estimators":500,"max_depth":100,"n_jobs":-1,"min_samples_leaf":10} "stride_x": 2, "stride_y": 2, "win_x":13, "win_y":13 "type":"FGPoolLayer", "name":"pool1", "bottoms": ["win1/7x7/ets", "win1/7x7/rf", "win1/10x10/ets", "win1/10x10/rf", "win1/13x13/ets", "win1/13x13/rf"], "tops": ["pool1/7x7/ets", "pool1/7x7/rf", "pool1/10x10/ets", "pool1/10x10/rf", "pool1/13x13/ets", "pool1/13x13/rf"], "pool_method": "avg", "win_x":2, "win_y":2

因为在代码中,json.loads()并没有读取完整的json文件,只是读取了行,所以这时json.loads(line)读取的是不合符json语法的字符串,会报错:

with open("文件名") as f:
    line=f.readline():   # 这里line只是读取了json文件的一行,并没有全部读取,所以line里面所存的字符串是不符合json语法的,所以读取出错。
    result=json.loads(line)
 Traceback (most recent call last):
  File "D:/PycharmProjects/mnistCheck/test.py", line 12, in <module>
    result = json.loads(row)
  File "C:\ProgramData\Anaconda3\envs\tensorflow\lib\json\__init__.py", line 319, in loads
    return _default_decoder.decode(s)
  File "C:\ProgramData\Anaconda3\envs\tensorflow\lib\json\decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\ProgramData\Anaconda3\envs\tensorflow\lib\json\decoder.py", line 355, in raw_decode
    obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 2 column 1 (char 2)

那么问题来了。。。。在实际应用中,我们会在json文件中做注释,比如以“//”开头的注释,除了注释部分外,其他内容都是符合json语法的,那么我们要怎么处理呢?

    def load_json(path):   
    import json
    lines = []     #  第一步:定义一个列表, 打开文件
    with open(path) as f:  
        for row in f.readlines(): # 第二步:读取文件内容 
            if row.strip().startswith("//"):   # 第三步:对每一行进行过滤 
                continue
            lines.append(row)                   # 第四步:将过滤后的行添加到列表中.
    return json.loads("\n".join(lines))       #将列表中的每个字符串用某一个符号拼接为一整个字符串,用json.loads()函数加载,这样就大功告成啦!!

今天的学习就到这里,明天见!!

最近在python里面用json读取json文件,可是老是不成功,特此记录一下。 预备知识:def load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw): """Deserialize ` 1.导入import json 2.字典转jsonjson.dumps(dict,ensure_ascii=False),加,ensure_ascii=False转换之后无中文乱码 3.json转字典:json.loads(str) 4.json转字典:requests.get().josn() 5.返回字符串: requests.get().text #!/usr/bin/python3 # encoding:utf-8 import json import requests class jsonC(): def __init__(self):
文章目录一、JSON介绍二、PythonJson数据类型的映射三、json.load(s)与json.dump(s)区别四、测试4.1 json.dumps()4.2 json.loads()4.3 json.dump()4.4 json.load()五、报错分析5.1 本地代码5.2 报错返回5.3 报错分析与解决 一、JSON介绍 JSON代表JavaScript对象符号。它是一种轻量级的数据交换格式,用于存储和交换数据。它是一种独立于语言的格式,非常容易理解,因为它本质上是自描述的。 python
本文[1]演示如何使用 Pythonjson.load() 和 json.loads() 方法从文件和字符串中读取 JSON 数据。使用 json.load() 和 json.loads() 方法,您可以将 JSON 格式的数据转换为 Python 类型,这个过程称为 JSON 解析。Python 内置模块 json 提供了以下两种解析 JSON 数据方法。 要从 URL 或文件解析 JSON,请使用 json.load()。要解析包含 JSON 内容的字符串,请使用 json.loads()
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。Python3 中可以使用 json 模块来对 JSON 数据进行编解码,它主要提供了四个方法:dumps、dump、loads、load。 dump和dumps dump和dumps对python对象进行序列化。将一个Python对象进行JSON格式的编码。 dump函数: json.dump(obj, fp, *, skipkeys=False, ensure_ascii=Tru...
python加载json数据示例 python加载json数据示例 python加载json数据示例python加载json数据示例python加载json数据示例python加载json数据示例python加载json数据示例 python加载json数据示例 python加载json数据示例python加载json数据示例python加载json数据示例python加载json数据示例python加载json数据示例 python加载json数据示例 python加载json数据示例python加载json数据示例python加载json数据示例python加载json数据示例python加载json数据示例 python加载json数据示例 python加载json数据示例python加载json数据示例python加载json数据示例python加载json数据示例python加载json数据示例 python加载json数据示例 python加载json数据示例python加载json数据示例python加载json数据示例python加载json数据示例
json.loads():把json化的字符串转换成对应的python对象(诸如dict/list/tuple/string等数据结构)(解码) 例如:字符串中的数据是个列表,eval()转换后,数据类型即为列表 str='[1,2,3,4,5,6]' eval_dict=eval(str) print(eval_dict,type(eval_dict)) 输出结果: [1, 2, 3
pythonjson文件处理涉及的四个函数json.dumps()和json.loads()、json.dump()和json.load()的区分 一、概念理解 1、json.dumps()和json.loads()是json格式处理函数(可以这么理解,json是字符串)   (1)json.dumps()函数是将一个Python数据类型列表进行json格式的编码(可以这么理解,json.d...
json.loadjson.loads都是Python中用于解析JSON数据方法json.load是用于从文件中读取JSON数据并将其解析为Python对象的方法。它需要一个文件对象作为参数,例如: import json with open('data.json', 'r') as f: data = json.load(f) 这将打开名为"data.json"的文件,读取其中的JSON数据并将其解析为Python对象,存储在变量"data"中。 json.loads则是用于将JSON字符串解析为Python对象的方法。它需要一个字符串作为参数,例如: import json json_string = '{"name": "Alice", "age": 30}' data = json.loads(json_string) 这将解析JSON字符串"{"name": "Alice", "age": 30}"并将其解析为Python对象,存储在变量"data"中。
result=json.loads(line) 这里没必要用f,readline()啊,直接f.read()就行了。 简写就是reault = json.loads(f.read()) 实际应用中也不会在json文件中写注释吧。 传参时 const string& 相对 const string 有哪些优势? m0_46484501: 效率高,也节约内存,值传递会调用拷贝构造函数,引用传的只是地址 传参时 const string& 相对 const string 有哪些优势? 莽村李宏伟: numpy操作中的axis的理解 wzh295406457: 你文章开头reshape创建的数组是三维的,为什么写成二维的呢,可以讨论一下吗https://blog.csdn.net/shield911/article/details/124073579 np.transpose 你这里写的B是原数组A中的每个元素在新数组中的位置,也就是说这里的B中的每个单元,是原数组在新数组的位置坐标,你这样理解就好理解了