Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式
目录
Pycharm使用技巧(转载)
Python第一天 安装 shell 文件
Python第二天 变量 运算符与表达式 input()与raw_input()区别 字符编码 python转义符 字符串格式化
Python第三天 序列 5种数据类型 数值 字符串 列表 元组 字典
Python第四天 流程控制 if else条件判断 for循环 while循环
Python第五天 文件访问 for循环访问文件 while循环访问文件 字符串的startswith函数和split函数
Python第六天 类型转换
Python第七天 函数 函数参数 函数变量 函数返回值 多类型传值 冗余参数 函数递归调用 匿名函数 内置函数 列表表达式/列表重写
Python第八天 模块 包 全局变量和内置变量__name__ Python path
Python第九天 面向对象 类定义 类的属性 类的方法 内部类 垃圾回收机制 类的继承 装饰器
Python第十天 print >> f,和fd.write()的区别 stdout的buffer 标准输入 标准输出 标准错误 重定向 输出流和输入流
Python第十一天 异常处理 glob模块和shlex模块 打开外部程序和subprocess模块 subprocess类 Pipe管道 operator模块 sorted函数 生成器 walk模块 hashlib模块
Python第十二天 收集主机信息 正则表达式 无名分组 有名分组
Python第十三天 django 1.6 导入模板 定义数据模型 访问数据库 GET和POST方法 SimpleCMDB项目 urllib模块 urllib2模块 httplib模块 django和web服务器整合 wsgi模块 gunicorn模块
Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式
Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fabric模块
python中的任何数据类型都可以dump成json格式
简单序列化
序列化
将对象的状态信息转换为可以存储或传输的形式的过程
内存里面有一个数据结构,你希望把它保存下来重用,或者发送给其他人。
很多游戏允许你在退出的时候保存进度,然后你再次启动的时候回到上次退出的地方
常用的一些序列化
pickle、cPickle 这两个模块用法差不多,cpickle模块,C语言实现,速度是pickle的1000倍
JSON
Shelve
YAML
-----------------------------------------------------------------------------------------
pickle模块
所有python支持的类型都可以用pickle做序列化
dump(obj, file, protocol=None)
obj:表示序列化的对象,处理循环,递归引用对象,类,函数,类的实例
file:支持write()方法的文件句柄,可以是真实文件,也可以StringIO对象
protocol:序列化协议,0表示ascii协议,ascii码表示,1表示老的二进制协议,2表示新二进制协议,默认为0
load(file)
文件中对象恢复为原来对象,反序列化
终端一:
>>> entry = {'a':11, 'b':22}
>>> import pickle
>>> with open('entry.pickle', 'wb') as f: 以二进制方式打开,文件名是entry.pickle
... pickle.dump(entry, f)
pickle的方法
dump保存到磁盘
dumps保存到内存
load 读到磁盘
loads 读到内存
从磁盘反序列化对象
终端二
>>> import pickle
>>> with open('entry.pickle', 'rb') as f: 文件名是entry.pickle
... entry = pickle.load(f)
>>> entry
{'a': 11, 'b': 22}
序列化到内存
>>> b = pickle.dumps(entry)
>>> entry3 = pickle.loads(b)
---------------------------------------------------------------------------------------
json模块
序列化对象供其他语言读写
JavaScript Object Notation
Json是被设计为跨语言使用的
Json是字符串格式
默认utf-8方式存储
javascript,json的key必须用用双引号引住字符串,不能用单引号
json序列化
json.dump() 其他格式数据转为json到磁盘
json.dumps() 其他格式数据转为json到内存
ensure_ascii=True:json只能ascii编码,同样,pickle模块的dump(obj, file, protocol=None),protocol:序列化协议,0表示ascii协议,ascii码表示,默认为0 indent:缩进,让打印出来的json字符串更好看print json.dumps(data, indent=2) encoding='utf-8':默认utf-8编码,utf-8传进来-》ascii def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding='utf-8', default=None, sort_keys=False, **kw):
json.load() 从磁盘读json转为其他格式数据
json.loads() 从内存读json转为其他格式数据
encoding=None:load方法可能无法处理中文字符,需要通过encoding参数指定字符编码,如果dumps()方法encoding时候的不是utf-8,需要指定一下编码 def loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
数据保存至JSON文件
import json
序列化
d = {}
d['a'] = 'a'
d['b'] = 235
d['c'] = ('c1','c2')
d['d'] = True
d['e'] = None
with open('/tmp/d.json', mode='w') as fd:
json.dump(d, fd)
cat /tmp/d.json
反序列化
with open('/tmp/d.json') as fd:
d1 = json.load(fd)
传递json格式的数据
定义url和方法
def collectjson(req):
if req.POST:
jsonobj = json.loads(req.body)
host = Host()
host.hostname = jsonobj['hostname']
host.vendor = jsonobj['vendor']
host.product = jsonobj['product']
……
host.save()
命令行访问数据库
python manager.py shell
from hostinfo.models import *
hg = HostGroup.objects.all()[0]
hg.groupname
hg.members.all()
h = hg.members.all()[0]
ip = h.ip
host = Host.object.get(hostname='agent03')
host.ip = '192.168.1.113' //修改记录
host.save()
--------------------------------------------------------------------
API的两种格式
----json 格式
{groupname: "web",members:[]}
[
{ groupanme: ‘web’,
members: [
{ hostname: ‘agent01’,
ip: ‘192.168.1.1’ },
]
},
]
----shell 格式
组名 主机名 ip地址
web agent02 192.168.3.163
web agent01 192.168.3.164
vim views.py
from django.shortcuts import render
from django.http import HttpResponse
from hostinfo.models import Host,HostGroup
import pickle
import json
# Create your views here.
def collect(req):
if req.POST:
#obj = pickle.loads(req.body)
obj = json.loads(req.body)
hostname = obj['hostname']
ip = obj['ip']
osver = obj['osver']
vendor = obj['vendor']
product = obj['product']
cpu_model = obj['cpu_model']
cpu_num = obj['cpu_num']
memory = obj['memory']
sn = obj['sn']
try:
host = Host.objects.get(sn=sn)
except:
host = Host()
host.hostname = hostname
host.ip = ip
host.osver = osver
host.vendor = vendor
host.product = product
host.cpu_model = cpu_model
host.cpu_num = cpu_num
host.memory = memory
host.sn = sn
host.save()
return HttpResponse('OK')
else:
return HttpResponse('not data')
def getjson(req):
ret_list = []
hg = HostGroup.objects.all()
for g in hg:
ret = {'groupname':g.groupname,'members':[]}
for h in g.members.all():
ret_h = {'hostname':h.hostname,'ip':h.ip}
ret['members'].append(ret_h)
ret_list.append(ret)
return HttpResponse(json.dumps(ret_list))
def gettxt(req):
res = ''
hg = HostGroup.objects.all()
for g in hg:
groupname = g.groupname
for h in g.members.all():
hostname = h.hostname
ip = h.ip
res += groupname+' '+hostname+' '+ip+'\n'
return HttpResponse(res)
json.dumps(ret_list)返回的是值是字符串类型
d1 = json.load(fd)
type(d1)
时间转为json解决方法
两个
To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the
``.default()`` method to serialize additional types), specify it with
the ``cls`` kwarg; otherwise ``JSONEncoder`` is used.cls代表类本身
``default(obj)`` is a function that should return a serializable version
of obj or raise TypeError. The default simply raises TypeError.
1、用类
def test(self): js = { 'test5': datetime.datetime.now(), } print(js) result = json.dumps(js, cls=CJsonEncoder) print(result) class CJsonEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime.datetime): return obj.strftime('%Y-%m-%d %H:%M:%S') elif isinstance(obj, datetime.date): return obj.strftime('%Y-%m-%d') else: return json.JSONEncoder.default(self, obj)
2、用函数
def json_serial(obj): if isinstance(obj,datetime.datetime): serial=obj.isoformat() return serial elif isinstance(obj,datetime.date): serial=obj.isoformat() return serial else: return json.JSONEncoder.default(obj) js = { 'test5': datetime.datetime.now(), } print json.dumps(js, default=json_serial)