返回顶部
首页 > 资讯 > 数据库 >序列化-pickle
  • 244
分享到

序列化-pickle

2024-04-02 19:04:59 244人浏览 泡泡鱼
摘要

序列化-pickle,JSON1、序列化将对象的状态信息转换为可以存储或者可以传输的形式过程内存中有一些结构数据,希望保存下来冲用,或者发送给别人使用很多游戏允许你在退出的时候保存进度,然后你再次启动的时候

序列化-pickle,JSON


1、序列化

将对象的状态信息转换为可以存储或者可以传输的形式过程

内存中有一些结构数据,希望保存下来冲用,或者发送给别人使用

很多游戏允许你在退出的时候保存进度,然后你再次启动的时候回到退出的地方。


2、常用的一些序列化

pickle,cPickle

jsON

Shelve

YAML


3、序列化对象到磁盘,所有的python支持的类型都可以用pickle做序列化

序列化到磁盘:pickle.dump(obj, file),从磁盘反序列化:pickle.load(file)

序列化到内存:pickle.dumps(obj),从内存反序列化:pickle.loads(str)

#pickle序列化到磁盘,pickle.dump(参数1,参数2),fd是问价句炳
In [1]: import pickle
In [2]: entry = {'a':11, 'b':22}
In [3]: with open('/tmp/1.pickle','wb') as fd:  #w表示写方式,b表示二进制
   ...:     pickle.dump(entry, fd)

[root@133 ~]# file /tmp/1.pickle 
/tmp/1.pickle: ASCII text   
[root@133 ~]cat /tmp/1.pickle 
(dp0
S'a'
p1
I11
sS'b'
p2
I22  
 
#pickle.load(fd)从硬盘反序列化,
In [7]: with open('/tmp/1.pickle') as fd:
   ...:     a = pickle.load(fd)   
   ...:     
In [8]: a
Out[8]: {'a': 11, 'b': 22}


#pickle序列化数据到内存中,
In [14]: entry = {'a':11, 'b':22}
In [15]: b = pickle.dumps(entry)
In [16]: b
Out[16]: "(dp0\nS'a'\np1\nI11\nsS'b'\np2\nI22\ns."

#pickle.loads(fd)从内存反序列化
In [17]: entry1=pickle.loads(b)
In [19]: entry1
Out[19]: {'a': 11, 'b': 22}


pickle简单应用

[root@133 tmp]# cd /opt/Python/Django/
[root@133 djanGo]# cp -pr simplecmdb simplecmdbbak
[root@133 simplecmdb]# cd  /opt/python/django/simplecmdbbak/simplecmdb
[root@133 simplecmdb]# vim settings.py
#注释掉默认的sqlite3数据库
#DATABASES = {
#    'default': {
#        'ENGINE': 'django.db.backends.sqlite3',
#        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#    }
#}
#指定使用Mysql数据库
DATABASES = {
    'default':{
        'ENGINE':'django.db.backends.mysql',
        'NAME':'cmdb',
        'USER':'root',
        'PASSWord':'Amos!@#$',
        'HOST':'127.0.0.1',
        'PORT':'3306',
    }
}

登录mysql,创建数据库cmdb,在数据库cmdb中创建数据表

[root@133 simplecmdbbak]# cd /opt/python/django/simplecmdbbak
[root@133 simplecmdbbak]# rm -rf db.sqlite3 #删除sqlite3的数据库
[root@133 simplecmdbbak]# cd hostinfo/
[root@133 hostinfo]# vim models.py #models.py已经定义了数据表,只要同步即可在mysql中建表
from django.db import models
# Create your models here.
class Host(models.Model):
    hostname = models.CharField(max_length = 50)
    ip = models.IPAddressField()
    vendor = models.CharField(max_length = 50)
    product = models.CharField(max_length = 50)
    sn = models.CharField(max_length = 50)
    cpu_model = models.CharField(max_length = 50)
    cpu_num = models.IntegerField(max_length = 50)
    memory = models.CharField(max_length = 50)
    osver = models.CharField(max_length = 50)
    
#查看数据库配置文件有没有错误
[root@133 simplecmdbbak]# python manage.py validate
0 errors found

mysql> create database cmdb;
Query OK, 1 row affected (0.00 sec)

[root@133 simplecmdbbak]# python manage.py syncdb
Creating tables ...
Creating table django_admin_log
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_groups
Creating table auth_user_user_permissions
Creating table auth_user
Creating table django_content_type
Creating table django_session
Creating table hostinfo_host
Creating table hostinfo_hostgroup_members
Creating table hostinfo_hostgroup

You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (leave blank to use 'root'): root
Email address: 1350368559@qq.com
Password: 
Password (again): 
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)

[root@133 simplecmdbbak]# mysql -uroot -p
Enter password: 
mysql> use cmdb;
Reading table infORMation for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+----------------------------+
| Tables_in_cmdb             |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_session             |
| hostinfo_host              |
| hostinfo_hostgroup         |
| hostinfo_hostgroup_members |
+----------------------------+
12 rows in set (0.00 sec)
mysql> exit
Bye

修改系统收集信息

[root@133 django]# vim /opt/python/django/sysinformation-pickle.py
import pickle

#   d = urllib.urlencode(dic)
    d = pickle.dumps(dic) #使用pickle将收集到的信息保存到内存中
    
#修改视图文件,得到属性文件
[root@133 django]# vim /opt/python/django/simplecmdbbak/hostinfo/views.py   
print req.body

启动django服务器

[root@133 simplecmdbbak]# python manage.py  runserver 112.65.140.133:8080

执行系统收集脚本:python sysinformation-pickle.py,报错500,排查过程如下:

[root@133 django]# python sysinformation-pickle.py #由于后边的变量值没有收到具体的信息报错
Traceback (most recent call last):
  File "sysinformation-pickle.py", line 118, in <module>
    req = urllib2.urlopen('Http://112.65.140.133:8080/hostinfo/collect/',d)
  File "/opt/amos/python2.7/lib/python2.7/urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "/opt/amos/python2.7/lib/python2.7/urllib2.py", line 406, in open
    response = meth(req, response)
  File "/opt/amos/python2.7/lib/python2.7/urllib2.py", line 519, in http_response
    'http', request, response, code, msg, hdrs)
  File "/opt/amos/python2.7/lib/python2.7/urllib2.py", line 444, in error
    return self._call_chain(*args)
  File "/opt/amos/python2.7/lib/python2.7/urllib2.py", line 378, in _call_chain
    result = func(*args)
  File "/opt/amos/python2.7/lib/python2.7/urllib2.py", line 527, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 500: INTERNAL SERVER ERROR
[root@133 simplecmdbbak]# python manage.py  runserver 112.65.140.133:8080
Validating models...

0 errors found
January 15, 2017 - 18:00:56
Django version 1.6.5, using settings 'simplecmdb.settings'
Starting development server at http://112.65.140.133:8080/
Quit the server with CONTROL-C.
#以下是pickle发送到服务器的信息,格式是pickle格式,由simplecmdbbak/hostinfo/views.py处理得到的
(dp0
S'osver'
p1
S'Centos release 6.7 (Final)'
p2
sS'product'
p3
S'PowerEdge R710'
p4
sS'vendor'
p5
S'Dell Inc.'
p6
sS'sn'
p7
S'4HBDT2X'
p8
sS'memory'
p9
S'19976M'
p10
sS'cpu_num'
p11
I8
sS'ip'
p12
(S'br1'
p13
S'112.65.140.133'
p14
S'A4:BA:DB:20:93:23'
p15
tp16
sS'hostname'
p17
S'133'
p18
sS'cpu_model'
p19
S'Intel(R) 2.00GHz'
p20
s.
None
None
None
None
None
None
None
None
None
[15/Jan/2017 18:01:04] "POST /hostinfo/collect/ HTTP/1.1" 500 118260

#测试,如果将:sysinformation-pickle.py修改为:
    d = urllib.urlencode(dic)
#    d = pickle.dumps(dic)
结果就是:
osver=CentOS+release+6.7+%28Final%29&product=PowerEdge+R710&vendor=Dell+Inc.&sn=4HBDT2X&memory=19976M&cpu_num=8&ip=%28%27br1%27%2C+%27112.65.140.133%27%2C+%27A4%3ABA%3ADB%3A20%3A93%3A23%27%29&hostname=133&cpu_model=Intel%28R%29+2.00GHz
133
('br1', '112.65.140.133', 'A4:BA:DB:20:93:23')
CentOS release 6.7 (Final)
Dell Inc.
PowerEdge R710
Intel(R) 2.00GHz
8
19976M
4HBDT2X


数据已经发送到djago这里,如何将数据发序列化出来成为字典,即可正常使用。
[root@133 django]# vim /opt/python/django/simplecmdbbak/hostinfo/views.py
from django.shortcuts import render
from django.http import HttpResponse
from hostinfo.models import Host
import pickle
# Create your views here.

def collect(req):
    if req.POST:
        print pickle.loads(req.body)
 [root@133 django]# python sysinformation-pickle.py#结果显示已经去得了pickle loads出来的字典了
{'product': 'PowerEdge R710', 'vendor': 'Dell Inc.', 'cpu_num': 8, 'ip': ('br1', '112.65.140.133', 'A4:BA:DB:20:93:23'), 'hostname': '133', 'cpu_model': 'Intel(R) 2.00GHz', 'osver': 'CentOS release 6.7 (Final)', 'sn': '4HBDT2X', 'memory': '19976M'}




[root@133 django]# vim /opt/python/django/simplecmdbbak/hostinfo/views.py
 import pickle
def collect(req):
    if req.POST:
        obj =  pickle.loads(req.body)
        hostname = obj['hostname']
        print hostname
        ip = obj['ip']
        print ip
        osver = obj['osver']
        print osver
        vendor = obj['vendor']
        print vendor
        product = obj['product']
        print product 
        cpu_model = obj['cpu_model']
        print cpu_model
        cpu_num = obj['cpu_num']
        print cpu_num
        memory = obj['memory']
        print memory
        sn = obj['sn']
        print sn
        
:10,27s/req.POST.get/obj/
:10,27s/(/[/
:10,27s/)/]/



[root@133 simplecmdb]# vim hostinfo/models.py
from django.db import models
# Create your models here.
class Host(models.Model):
    hostname = models.CharField(max_length = 200)
    ip = models.IPAddressField()
    vendor = models.CharField(max_length = 200)
    product = models.CharField(max_length = 200)
    sn = models.CharField(max_length = 200)
    cpu_model = models.CharField(max_length = 200)
    cpu_num = models.IntegerField(max_length = 200)
    memory = models.CharField(max_length = 200)
    osver = models.CharField(max_length = 200)

    def __unicode__(self):
        return self.hostname
数据库字段的长度改为200,然后数据库cmdb删除,重新同步的,结果还是一样。500
搞不清为什么会这样?


另外一个问题:
    #d = urllib.urlencode(dic)
    d = pickle.dumps(dic)
    req = urllib2.urlopen('http://112.65.140.133:8080/hostinfo/collect/',d)
    print req.read()    #d = urllib.urlencode(dic)
  
这里的d难道不用urlencode吗?不转换成urlencode格式,怎么能用urllib2.urlopen发送处理呢?

host是实例,不是字典,所以不能这样host['hostname'],只能host.hostname这样来调用属性。
可以在实例化( host = Host())之前来打印hostname、ip等信息,来进行拍错。
这里的d是序列化后的对象,这里可以使用pickle序列化,跟使用json一样。
视频里有三种方式
1. 使用urlencode
2. 使用pickle
3. 使用json


我的问题找到了,原因是:ip = models.IPAddressField() 无法保存元祖。

def collect(req):
    if req.POST:
        print pickle.loads(req.body)
        obj =  pickle.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']
        print sn
        print 'pickle load ok'

        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
        print host.sn
        host.save()
        print "host save ok"  #没有打印
        print host.sn               #没有打印
        return HttpResponse('OK')
    else:
        return HttpResponse('no data')

结果是:
[16/Jan/2017 11:34:20] "POST /hostinfo/collect/ HTTP/1.1" 500 72226
{'product': 'PowerEdge R710', 'vendor': 'Dell Inc.', 'cpu_num': 8, 'ip': ('br1', '112.65.140.133', 'A4:BA:DB:20:93:23'), 'hostname': '133', 'cpu_model': 'Intel(R) 2.00GHz', 'osver': 'CentOS release 6.7 (Final)', 'sn': '4HBDT2X', 'memory': '19976M'}
4HBDT2X
pickle load ok
4HBDT2X

很明显是host.save()没有成功,但是我却不知道为什么没有成功?

最后发现是:
我打印出来的IP被我设置为三个参数:
def parseIfconfig(parsed_data):
    dic = {}
    tuple_addr= ('lo','vir','vnet','em3','em4')
    parsed_data = [i for i in parsed_data if i and not i.startswith(tuple_addr)]
    for lines in parsed_data:
        line_list = lines.split('\n')
        devname = line_list[0].split()[0]
        Macaddr = line_list[0].split()[-1]
        ipaddr = line_list[1].split()[1].split(':')[1]
        break
    dic['ip'] = devname,ipaddr,macaddr
    return dic

ip如果是:'ip': '112.65.140.133' 就可以保存了
而实际结果是:'ip': ('br1', '112.65.140.133', 'A4:BA:DB:20:93:23')
所以无法保存到数据库中,所以会报错
改为:
dic['ip'] = ipaddr
就ok了
您可能感兴趣的文档:

--结束END--

本文标题: 序列化-pickle

本文链接: https://lsjlt.com/news/44140.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 序列化-pickle
    序列化-pickle,json1、序列化将对象的状态信息转换为可以存储或者可以传输的形式过程内存中有一些结构数据,希望保存下来冲用,或者发送给别人使用很多游戏允许你在退出的时候保存进度,然后你再次启动的时候...
    99+
    2024-04-02
  • Python的pickle序列化和JSON序列化实例分析
    本文小编为大家详细介绍“Python的pickle序列化和JSON序列化实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python的pickle序列化和JSON序列化实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一...
    99+
    2023-06-30
  • Python序列化模块JSON与Pickle
    序列化把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flat...
    99+
    2024-04-02
  • python Json与pickle数据序列化
    在程序运行的过程中,所有的变量都是在内存中。一旦程序结束,变量所占用的内存就被操作系统全部回收。为了避免数据丢失,把变量从内存中变成可存储或传输的过程称之为序列化序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。反过...
    99+
    2023-01-30
    序列化 数据 python
  • Python数据序列化之pickle模块
    目录1将Python数据存储为本地文件①存储过程②加载过程2将Python数据存储为程序的一部分①存储过程②加载过程前言: 在英语中 pickle 名词是泡菜,动词是腌渍的意思。可以...
    99+
    2024-04-02
  • Python常用标准库详解(pickle序列化和JSON序列化)
    目录常用的标准库序列化模块序列化和反序列化使用场景dumps & loadsdump & loadJSON序列化模块使用场景支持的数据类型JSON和pickle的区别...
    99+
    2024-04-02
  • Python 对象序列化与反序列化之pickle json详细解析
    目录引言picklejson尾语引言 将对象的状态信息转换为可以存储或传输的形式的过程叫作序列化 类似地从序列化后的数据转换成相对应的对象叫作 反序列化 本文介绍 Python 将对...
    99+
    2024-04-02
  • 详解Python之数据序列化(json、pickle、shelve)
    一、前言 1. 现实需求 每种编程语言都有各自的数据类型,其中面向对象的编程语言还允许开发者自定义数据类型(如:自定义类),Python也是一样。很多时候我们会有这样的需求: 把内存中的各种数据类型的...
    99+
    2022-06-04
    详解 序列化 数据
  • Python序列化模块之pickle与json详解
    目录序列化模块序列化和反序列化使用场景dumps & loadsdump & loadJSON序列化模块使用场景支持的数据类型JSON和pickle的区别序列化函数j...
    99+
    2024-04-02
  • PythonJson与pickle模块序列化使用介绍
    用于序列化的两个模块 json,用于字符串 和 python数据类型间进行转换pickle,用于python特有的类型 和 python的数据类型间进行转换 Json模块提供了四个功...
    99+
    2024-04-02
  • Python数据序列化的pickle模块怎么用
    这篇文章主要介绍了Python数据序列化的pickle模块怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python数据序列化的pickle模块怎么用文章都会有所收获,下面我们一起来看看吧。前言:在英语中...
    99+
    2023-06-29
  • 如何使用Python中的pickle和JSON进行对象序列化和反序列化
    如何使用Python中的pickle和JSON进行对象序列化和反序列化Python是一种简单而强大的编程语言,其内置了许多有用的库和模块,使开发人员能够快速进行各种任务。其中,pickle和JSON是两个常用的模块,用于对象序列化和反序列化...
    99+
    2023-10-22
    序列化 JSON pickle
  • Python序列化模块之pickle与json怎么使用
    本篇内容主要讲解“Python序列化模块之pickle与json怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python序列化模块之pickle与json怎么使用”吧!序列化模块imp...
    99+
    2023-06-30
  • 如何使用Python中的pickle模块进行对象序列化
    如何使用Python中的pickle模块进行对象序列化概述:在Python编程中,我们经常需要将数据保存到文件或通过网络传输。而对象序列化是一种将对象转化为可存储或传输的格式的过程,而pickle模块正是Python中一种常用的序列化模块。...
    99+
    2023-10-22
    Python pickle 对象序列化
  • 序列化与反序列化
    序列化(pickling)   把变量从内存中变成可存储或传输的过程 反序列化(unpickling)   把变量内容从序列化的对象重新读到内存里的过程 序列化&反序列化的意义  在程序运行过程中,对象可在内存中被自由的修改  一...
    99+
    2023-01-31
    序列 化与 序列化
  • Python中的json和pickle在数据序列化和反序列化方面的优劣势和性能比较是什么?
    Python中的json和pickle在数据序列化和反序列化方面的优劣势和性能比较序列化是指将数据结构或对象转换为可存储或传输的格式的过程,而反序列化是将已序列化的数据转换回原始对象的过程。Python提供了许多用于序列化和反序列化数据的库...
    99+
    2023-10-22
    Python JSON pickle 关键词:
  • PHP序列化和反序列化
    一.什么是序列化和反序列化 php类与对象 类是定义一系列属性和操作的模板,而对象,就是把属性进行实例化,完事交给类里面的方法,进行处理。 `。尝试构造payload: ...
    99+
    2023-08-31
    php 开发语言
  • Java序列化与反序列化
    目录Java 序列化与反序列化序列化APIObjectOutputStreamObjectInputStreamserialVersionUIDTransient (瞬态变量)实例理...
    99+
    2023-05-14
    Java序列化 Java反序列化
  • 【反序列化漏洞-01】序列化与反序列化概述
    为什么要序列化 百度百科上关于序列化的定义是,将对象的状态信息转换为可以存储或传输的形式(字符串)的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区(非关系型键值对形式的数据库Redis,与数组类似)。以后,可以通过从存储区中...
    99+
    2023-09-06
    web安全 安全 反序列化 序列化 PHP反序列化漏洞 Powered by 金山文档
  • 协议,序列化,反序列化,Json
    文章目录 协议序列化和反序列化网络计算器protocol.hppServer.hppServer.ccClient.hppClient.cclog.txt通过结果再次理解通信过程 Json...
    99+
    2023-09-01
    json 网络 服务器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作