python 中 JSON 读写文件操作

主要演示了 python 3 中 json 的读写和拼接。

1 介绍

如果我们需要将 python 中的数据对象存储到文件中(或从文件中读取),有两种方式进行保存。一种是使用 pickle 模块,该模块提供了四个功能:dumps、dump、loads、load。 用来将 python 中的任意数据类型进行存储。不过存储的文件只能用 pickle 模块进行读取。另一种就是这里介绍的方式,使用 json 模块,该模块能够将 python 中的常用数据类型存储为 JSON 格式(一种通用的轻量级数据交换格式,如果不太了解 JSON,可以参考 JSON 教程)。对应的也提供了 dumps、dump、loads、load 四种功能。

2 python 可转 JSON 的数据类型

并不是所有的 python 对象都是可以转成 JSON 的。只有特定的基本类型才可以转为 JSON 。对应的转换关系如下表所示:

Python 类型

JSON 类型

dict

object

list,tuple

array

str,unicode

string

int,long,float

number

True

true

False

false

None

null

只有上表中列出来的数据类型才支持转为 JSON 格式,其他的类型包括自定义的数据类型都是不支持的。

如果需要输出其他的数据类型,且读取和存储都是使用的 python 可以考虑使用上面提到的 pickle 模块。

3 代码演示

这里主要演示以下五个常用的功能:

  1. python 数据结构转 json 字符串 —— dumps
  2. python 数据结构转 json 文件 —— dump
  3. json 字符串转 python 数据结构 —— loads
  4. json 文件转 python 数据结构 —— load
  5. 拼接 json 文件和 python 数据结构(json 文件拼接) —— map 拼接

下面代码使用的 python 版本为: 3.6.4.

# encoding: utf-8

"""
本文件用来演示 python 自带的 json 处理模块,主要演示内容如下:
1. python 数据结构转 json 字符串
2. python 数据结构转 json 文件
3. json 字符串转 python 数据结构
4. json 文件转 python 数据结构
5. 拼接 json 文件和 python 数据结构(json 文件拼接)

"""

import json
import numpy as np

data = {
    'EvalRegion':{
        'IncludeRegion':{
            'Shape':'Cricle',
            'Center':[
                0,
                1
            ],
            'Radius':50,
            'StartAngle':-np.pi/4,
            'EndAngle':np.pi/4
            },
        'ExcludeRegion':None,
        'Message':'提示信息'
    }
}

print(data)
# 转成 json 字符串
jsonStr = json.dumps(data,indent=4,ensure_ascii=False)
print(jsonStr)
# 转成 json 文件
with open("erconfig.json","w") as f:
    isR = json.dump(data,f,indent=4,ensure_ascii=False)
    print("配置写入完成...")
# 从字符串中读取
dataFromStr = json.loads(jsonStr)
# 从文件中读取
with open("erconfig.json","r") as f:
    dataFromFile = json.load(f)
    print("配置载入完毕...")
# 在读取的配置后添另一个配置并写入最终文件
data2 = {
    'EvaluationItem':{
        'Classification':True,
        'ObjectNumber':False,
        'Position':True,
        'Size':False,
        'Velocity':True,
        'Angle':True
    }
}
dataFromFile.update(data2)
with open('allconfig.json','w') as f:
    json.dump(dataFromFile,f,indent=4,ensure_ascii=False)
    print("所有配置写入完毕...")
print("\n主要的配置项有:")
for key in dataFromFile.keys():
    print(key)

上面代码的意义十分明显,不做过多的解释了。这里只对 dumpsdump 函数的几个参数做一些说明:

  • indent: 应该是一个非负的整形,如果为0或者不设置,则一行显示所有数据。否则会换行且安装指定的 indent 数在前面添加对应的空格。打印出来的数据也叫 pretty-printed json。
  • ensure_ascii: 默认为 True,如果 dict 内有 non-ASCII 字符,则会显示 \uXXXX。设置成 False 后,就能正常显示。输出中文一般设置为 False。
  • sort_keys: 默认为 False,是否将数据根据 keys 的值进行排序。
  • encoding: 默认为 UTF-8,设置 json 数据的编码方式。
  • Skipkeys: 默认为 False,如果 dict 中的数据不是 python 的基本类型(上面的那些基本类型),是否跳过。如果为 False 会给出 TypeError 的错误。如果为 True 忽略跳过。
  • separators: 分隔符,默认为(',',';')。实际是 item_separator (默认为,)和 dict_separator (默认为:)。

参考文章

python 读写 json 文件Python JSONpython 解析与组装 json