python操作文件——序列化pickling和JSON
当我们在内存中定义一个dict的时候,我们是可以随时修改变量的内容的:
>>> d=dict(name='wc',age=28)
>>> d
{'name': 'wc', 'age': 28}
我们可以随时修改name和age的值。但是当我们重新运行程序的时候,name、age的初始化值还是wc和28,实际情况下我们需要保存该dict的最后的值。
我们把变量从内存中变成可存储或传输的过程称之为序列化。python中称之为pickling,Java中叫serialization,都是一个意思。序列化之后我们就可以把内容写入到磁盘或者通过网络传输出去。反之,把变量从序列化的对象重新读取到内存中称之为反序列化,洋名叫unpickling。
python中实现序列化的模块叫pickle。pickle.dumps()方法可以把任意的对象序列化成一个Bytes,然后就可以把这个bytes写入文件。pickle.dump()方法可以直接把对象序列化写入一个file-like的对象中。相反的,pickle.loads()方法可以把文件中的内容读入到一个bytes,然后把这个bytes对象转换为目标类型对象,也可以使用pickle.load()方法直接从一个file-like对象中直接反序列化出对象:
>>> f = open('E:\\python3.6.3\\workspace\\dump.txt','wb')
>>> pickle.dump(d,f)
>>> f.close()
>>> f=open('E:\\python3.6.3\\workspace\\dump.txt','rb')
>>> c = pickle.load(f)
>>> c
{'name': 'wc', 'age': 28}
JSON
实际开发中我们或多或少都会碰到跨语言传输数据的问题,这就要求我们要把对象序列化为标准格式,比如JSON和XML。JSON的表现形式就是一个字符串,可以被所有的语言读取。可以方便的存储到磁盘或者通过网络传输。JSON表示的对象是标准的JavaScript的对象,其和python内置的数据类型的对应关系如下:
| JSON类型 | Python类型 |
| {} | dict |
| [] | list |
| "" | str |
| 123.4 | int 或 float |
| true/false | True/False |
| null | None |
python内置了json模块可以方便的在python对象和json对象之间转换:
>>> import json
>>> d=dict(name='wc',age=28)
>>> json.dumps(d)
'{"name": "wc", "age": 28}'
>>> c = json.dumps(d)
>>> d=json .loads(c)
>>> d
{'name': 'wc', 'age': 28}
python内置的数据类型可以直接转换为json类型,但是class对象并不刻意直接转为json,这是因为class对象默认的并不具有可序列化的属性。
2种方法,第一种是通过dumps()方法的default参数,把任意一个对象转换为一个可序列化的对象。下面的例子中,先定义一个Student的class,然后定义一个student2dict()函数,该函数的作用就是把Student的属性转换为dict,最后再序列化为json:
>>> import json
>>> class Student(object):
... def __init__(self,name,age):
... self.name = name
... self.age = age
...
>>> def student2dict(s):
... return {'name':s.name,'age':s.age}
...
>>> s=Student('wc',28)
>>> print(json.dumps(s,default=student2dict))
{"name": "wc", "age": 28}
第二种方法,借用class对象的__dict__属性:
>>> class Teacher(object):
... def __init__(self,name,age):
... self.name = name
... self.age = age
...
>>> t = Teacher('ly',90)
>>> print(json.dumps(t,default=lambda obj:obj.__dict__))
{"name": "ly", "age": 90}
python操作文件——序列化pickling和JSON的更多相关文章
- 使用python操作文件实现购物车程序
使用python操作文件实现购物车程序 题目要求如下: 实现思路 始终维护一张字典,该字典里保存有用户账号密码,购物车记录等信息.在程序开始的时候读进来,程序结束的时候写回文件里去.在登录注册的部分, ...
- Python操作文件、文件夹、字符串
Python 字符串操作 去空格及特殊符号 s.strip().lstrip().rstrip(',') 复制字符串 #strcpy(sStr1,sStr2) sStr1 = 'strcpy' sSt ...
- Python操作文件和目录
Python操作文件和目录 读写文件比较简单,有一点特别注意就好了 windows下Python默认打开的文件以gbk解码,而一般我们的文件是utf-8编码的,所以如果文本含有中文,就会出现异常或者乱 ...
- python操作文件练习,配置haproxy
在使用python操作文件的时候,特别是对于网络设备,通常操作配置文件,会简化配置量,配置文件加载到内存中,运行时使用的是内存中的配置,内存中配置修改后立即生效,如果不将配置内容保存到硬盘中,则下次重 ...
- Python操作文件-20181121
Python操作文件 Python操作文件和其他语言一样,操作的过程无非是先定位找到文件.打开文件,然后对文件进行操作,操作完成后关闭文件即可. 文件操作方式:对文件进行操作,主要就是读.写的方式,p ...
- 用Python操作文件
用Python操作文件 用word操作一个文件的流程如下: 1.找到文件,双击打开. 2.读或修改. 3.保存&关闭. 用Python操作文件也差不多: f=open(filename) # ...
- 文件操作mode学习总结-----Python学习总结【第四篇】:Python之文件操作(文件、正则、json、pickle)
非常全的博客,防丢链接参考https://www.cnblogs.com/madsnotes/articles/5521551.html 1.文件操作 1.1 操作流程 1)文件打开 2)文件操作 3 ...
- python操作文件案例二则
前言 python 对于文件及文件夹的操作. 涉及到 遍历文件夹下所有文件 ,文件的读写和操作 等等. 代码一 作用:查找文件夹下(包括子文件夹)下所有文件的名字,找出 名字中含有中文或者空格的文件 ...
- open -python操作文件
一打开文件 二操作文件 三关闭文件 open(文件,模式,编码),打开文件----->0101010(以二进制的方式打开)------>编码(open默认utf-8编码)------> ...
随机推荐
- 初探three.js光源
上一节我们简单的说了一下THREE中必要的元素.今天我们深入探讨一下各种THREE的光源. 一 基础光源 基础光源有4种1.THREE.AmbientLight(环境光源)2.THREE.PointL ...
- CTF中遇到的php
1.if(eregi("hackerDJ",$_GET[id])) { //eregi字符串对比 echo("<p>not allowed!</p& ...
- yum运行报错:/usr/lib64/python2.7/site-packages/pycurl.so: undefined symbol: CRYPTO_num_locks
是因为yum动态库使用了新安装libcurl库导致的.使用ldd查看动态库依赖关系: ldd /usr/lib64/python2.7/site-packages/pycurl.so 删除动态库配置中 ...
- django ListView
context_object_name = 'posts'. The template default name is ListView 'object_list' from .models impo ...
- Identityserver4配置证书
IS4中如果token的类型是JWT,则需要使用RS256算法生成非对称签名,这意味着必须使用私钥来签名JWT token,并且必须使用对应的公钥来验证token签名,即验证token是否有效.使用R ...
- 批量更新Linux文件后缀名
#!/bin/bash#Create_Time 2019-08-06#use: small_wei #查找并,批量修改文件后缀 #后缀为 .txt 修改为 .log find /opt -name & ...
- python_Django
1.Python用具 - pip 1.作用: Python的软件包管理器,有一些python包被集成到了pip中.只要被集成到pip中的包,都允许通过pip直接安装 2.安装 ...
- linux进程间通信之共享内存学习记录
进程 狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed). 广义定义:进程是一个具有一定独立功能的 ...
- PAT甲级专题|链表
PAT链表专题 关于PAT甲级的链表问题,主要内容 就是"建立链表" 所以第一步学会模拟链表,pat又不卡时间,这里用vector + 结构体,更简洁 模拟链表的普遍代码 cons ...
- Ubuntu 18.04 LTS上安装NFS服务器和客户端
NFS是基于UDP/IP协议的应用,其实现主要是采用远程过程调用RPC机制,RPC提供了一组与机器.操作系统以及低层传送协议无关的存取远程文件的操作.RPC采用了XDR的支持.XDR是一种与机器无关的 ...