Python之路(第十五篇)sys模块、json模块、pickle模块、shelve模块
一、sys模块
1、sys.argv
命令行参数List,第一个元素是程序本身路径
%E3%80%90day22%E3%80%91\sys.argv1.gif?lastModify=1525869572)


%E3%80%90day22%E3%80%91\sys.argv%202.gif?lastModify=1525869572)
2、sys.exit(n)
退出程序,正常退出时exit(0)
3、sys.version 、 sys.maxint
sys.version 获取Python解释程序的版本信息
sys.maxint 最大的Int值

%E3%80%90day22%E3%80%91\sys.version%20%E3%80%81%20sys.maxint%20%20.gif?lastModify=1525869572)
4、sys.path
返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
%E3%80%90day22%E3%80%91\sys.path.gif?lastModify=1525869572)

分析:sys.path输出的第一个结果是程序执行文件所在的文件夹绝对路径,这里的输出结果第二个是工程文件目录,但是这个目录是pycharm自主加上的,直接用解释器执行是没有这个路径的。
5、sys.platform
返回操作系统平台名称
%E3%80%90day22%E3%80%91\sys.platform%20%20.gif?lastModify=1525869572)

6、sys.stdout.write() 、sys.stdout.flush()
sys.stdout.write() 标准输出 , sys.stdout.write 在交互器模式下这个函数输出数据到stdout,同时还有一个返回值,就是字符串的长度。在pycharm里输出不会有字符串的长度。
sys.stdout.flush() 刷新输出

在Linux系统下,必须加入sys.stdout.flush()才能一秒输一个字符(交互器模式下)
在Windows系统下,加不加sys.stdout.flush()都能一秒输出一个字符(交互器模式下)
在pycharm里都必须加sys.stdout.flush()才能刷新输出
%E3%80%90day22%E3%80%91\sys.stdout.write.gif?lastModify=1525869572)
例子
需求:做一个简单的进度条
%E3%80%90day22%E3%80%91\%E7%AE%80%E5%8D%95%E8%BF%9B%E5%BA%A6%E6%9D%A1.gif?lastModify=1525869572)

7、 sys.stdin.readline() 、sys.getrecursionlimit() 、sys.setrecursionlimit(1200)
sys.stdin.readline()[:-1] 标准输入
sys.getrecursionlimit() 获取最大递归层数
sys.setrecursionlimit(1200) 设置最大递归层数

%E3%80%90day22%E3%80%91\sys.stdin.readline.gif?lastModify=1525869572)
8、sys.getdefaultencoding() 、sys.getfilesystemencoding
sys.getdefaultencoding() 获取解释器默认编码
sys.getfilesystemencoding 获取内存数据存到文件里的默认编码
二、json模块、pickle模块
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,Python的Json模块有序列化与反序列化两个过程。即 encoding和 decoding。
- encoding:把一个python对象编码转换成Json字符串。 
- decoding:把json格式字符串编码转换成python对象。 -  
什么是序列化、反序列化?
我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。
即把python中的对象变成可存储的json字符串。序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。
反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。
Json模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump、loads、load
JSON和Python内置的数据类型对应关系
JSON表示的对象就是标准的JavaScript语言的对象,JSON和Python内置的数据类型对应如下:
%E3%80%90day22%E3%80%91\json%E5%92%8Cpython%E4%B9%8B%E9%97%B4%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E7%9A%84%E5%AF%B9%E5%BA%94%E5%85%B3%E7%B3%BB.png?lastModify=1525869572)

json和python之间相互转换
%E3%80%90day22%E3%80%91\json%E5%92%8Cpython%E4%B9%8B%E9%97%B4%E7%9B%B8%E4%BA%92%E8%BD%AC%E6%8D%A2.png?lastModify=1525869572)

json的4个方法
json提供四个功能:dumps, dump, loads, load
1、dumps和dump
序列化过程
将一个python对象编码转换成Json字符串,可以存储可以网络远程传输
dumps只完成了序列化为str,将数据通过特殊的形式转换为所有程序语言都认识的字符串
dump必须传文件描述符,将序列化的str保存到文件中,将数据通过特殊的形式转换为所有程序语言都认识的字符串,并写入文件
dumps()用法
例子
import json
dic = {"k1":"v1"}
str1= "nicholas"
data1 = json.dumps(dic)
data2 = json.dumps(str1)
print(data1)
print(data2)
print(type(data1))
print(type(data2))
输出结果

%E3%80%90day22%E3%80%91\dumps.gif?lastModify=1525869572)
dump
例子
import json
dic = {"k1":"v1"}
with open("test.json","a+") as f :
json.dump(dic,f)#传入要序列化的数据、文件描述符
输出结果

%E3%80%90day22%E3%80%91\dump.gif?lastModify=1525869572)
分析:数据通过json.dump转换为所有程序语言都认识的字符串,并写入文件
dump等价于dumps加上打开文件然后将data = json.dumps(var) 写入文件。
例子
import json
dic = {"k1":"v1"}
data = json.dumps(dic)
with open("test.json","a+") as f :
f.write(data)
2、loads 和 load
 loads 只完成了反序列化,将json编码的字符串再转换为python的数据结构
 load 只接收文件描述符,完成了读取文件和反序列化,数据文件中读取数据,并将json编码的字符串转换为python的数据结构
用loads例子
import json
with open("test.json") as f :
data = json.loads(f.read()) #需要加入f.read()方法读取文件数据
print(data)
print(type(data))
输出结果
  {'k1': 'v1'}
  <class 'dict'>
用load例子2
import json
with open("test.json") as f :
data = json.load(f) #直接加入文件描述符即可
print(data)
print(type(data))
输出结果
  {'k1': 'v1'}
  <class 'dict'>
pickle和python之间相互转换

Pickle的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于Python,并且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的数据,不能成功地反序列化也没关系。
%E3%80%90day22%E3%80%91\pickle%E5%92%8Cpython%E4%B9%8B%E9%97%B4%E7%9B%B8%E4%BA%92%E8%BD%AC%E6%8D%A2.png?lastModify=1525869572)
picle模块 和json模块都有 dumps、dump、loads、load四种方法,而且用法一样。
不用的是json模块序列化出来的是通用格式,其它编程语言都认识,就是普通的字符串,
而picle模块序列化出来的只有python可以认识,其他编程语言不认识的,表现为乱码
注意json的序列化之后产生的格式是还是字符串,pickle序列化之后产生的格式是字节流,可以直接用于网络传输。

例子1
import pickle
dic = {"k1":"v1"}
with open("test.pickle","wb") as f: #注意这里要用二进制模式,序列化后的对象是'bytes'
data = pickle.dumps(dic)
f.write(data)
或者
import pickle
dic = {"k1":"v1"}
with open("test.pickle","wb") as f:
data = pickle.dump(dic,f)
例子2
import pickle
with open("test.pickle","rb") as f:
data = pickle.loads(f.read())
print(data)
或者
import pickle
with open("test.pickle","rb") as f:
data = pickle.load(f)
print(data)
json vs pickle比较:
JSON:
优点:跨语言、体积小
缺点:只能支持int\str\list\tuple\dict
Pickle:
优点:专为python设计,支持python所有的数据类型
缺点:只能在python中使用,存储数据占空间大
三、shelve 模块
shelve是封装了pickle,shelve 只能在python中用
shelve模块比pickle模块简单,只有一个open函数,返回类似字典的对象,可读可写;key必须为字符串,而值可以是python所支持的数据类型
序列化:保存对象至shelve文件中
例子
import shelve
f = shelve.open("test")
names = ["nicholas","jack","pony"] #python中的数据
info = {"age":[18,54,48],"some":[1,2,3]} #python中的数据
f["names"] = ["nicholas","jack","pony"] #向文件中添加内容,添加方式与给字典添加键值对类似
f["info"] = {"age":[18,54,48],"some":[1,2,3]} #向文件中添加内容,添加方式与给字典添加键值对类似
f.close() #关闭文件
输出结果

%E3%80%90day22%E3%80%91\shelve%E5%BA%8F%E5%88%97%E5%8C%96.gif?lastModify=1525869572)
分析:shelve序列化后产生3个文件
反序列化:从文件中读取对象
例子
import shelve
d = shelve.open("test")
names = d["names"] # 从文件中类似字典中获取键值的方式一样读取内容
info = d["info"]
print(names,type(names))
print(info,type(info))
d.close() #关闭文件
输出结果
%E3%80%90day22%E3%80%91\shelve%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96.gif?lastModify=1525869572)

Python之路(第十五篇)sys模块、json模块、pickle模块、shelve模块的更多相关文章
- Python之路(第二十五篇) 面向对象初级:反射、内置方法
		[TOC] 一.反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它 ... 
- 第九节:os、sys、json、pickle、shelve模块
		OS模块: os.getcwd()获取当前路径os.chdir()改变目录os.curdir返回当前目录os.pardir()父目录os.makedirs('a/b/c')创建多层目录os.remov ... 
- Python之路【第五篇】:面向对象和相关
		Python之路[第五篇]:面向对象及相关 面向对象基础 基础内容介绍详见一下两篇博文: 面向对象初级篇 面向对象进阶篇 其他相关 一.isinstance(obj, cls) 检查是否obj是否 ... 
- Python之路【第五篇】:面向对象及相关
		Python之路[第五篇]:面向对象及相关 面向对象基础 基础内容介绍详见一下两篇博文: 面向对象初级篇 面向对象进阶篇 其他相关 一.isinstance(obj, cls) 检查是否obj是否 ... 
- Python之路(第十二篇)程序解耦、模块介绍\导入\安装、包
		一.程序解耦 解耦总的一句话来说,减少依赖,抽象业务和逻辑,让各个功能实现独立. 直观理解“解耦”,就是我可以替换某个模块,对原来系统的功能不造成影响.是两个东西原来互相影响,现在让他们独立发展:核心 ... 
- Python开发【第十五篇】模块的导入
		的导入语句 import 语句 语法: import 模块名1 [as 模块别名] 作用: 将某模块整体导入到当前模块 示例: import math import sys,os 用法: 模块名.属性 ... 
- Python之路(第十六篇)xml模块、datetime模块
		一.xml模块 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单, xml比较早,早期许多软件都是用xml,至今很多传统公司如金融行业的很多系统的接口还主要 ... 
- 023--python os、sys、json、pickle、xml模块
		一.os模块 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 >>> os.getcwd() 'C:\\Python36' os.chdir(&quo ... 
- python模块-json、pickle、shelve
		json模块 用于文件处理时其他数据类型与js字符串之间转换.在将其他数据类型转换为js字符串时(dump方法),首先将前者内部所有的单引号变为双引号,再整体加上引号(单或双)转换为js字符串:再使用 ... 
随机推荐
- springboot-day01-引入如何读取配置文件以及helloWorld
			前言:该文章是紧接上一篇文章http://www.cnblogs.com/newAndHui/p/8058527.html 3.3. 实战 3.3.1.读取外部的资源配置文件 通过@PropertyS ... 
- AssetBundle Manager
			[AssetBundle Manager] AssetBundleManager是一个款Unity公司制作的Unity库. 1.Simulation Mode The main advantage o ... 
- windows上java中文乱码-指定字符集 -Dfile.encoding=UTF-8
			jvm启动中增加参数: -Dfile.encoding=UTF-8 重启即可. 
- easymock单元测试跟踪工具
			EasyMock can save a lot of legwork and make unit tests a lot faster to write. builder.com Java E-New ... 
- db2start提示SQL5043,关闭连接终端tty
			db2 V10.3启动的时候提示: 问题1: db2start执行后提示: SQL1072C The database manager resources are in an inconsisten ... 
- angularjs 粘贴事件
			参考 http://www.jb51.net/article/89708.htm ng-paste 需要setTimeout,否则无法获取到数据 
- java根据wsdl调用webservice
			本方法参考 Java核心技术 卷二 (第八版) 中10.6.2节相关内容,特与大家分享,欢迎大家批评指教 <a href="http://www.webxml.com.cn/" ... 
- 【Django】关于使用阿里的iconfont
			刚刚从看到课程里老师使用了阿里提供的矢量图标iconfont.cn 我记录一下基本步骤: 1.登录iconfont.cn,搜索图标 2.选中想要的icon点击添加入库,再从右上方点购物车,把icon添 ... 
- pandas中关于DataFrame 去除省略号
			#显示所有列 pd.set_option('display.max_columns', None) #显示所有行 pd.set_option('display.max_rows', None) #设置 ... 
- Postman 测试swagger类接口技巧
			测试情景: 公司的项目接口越来越多,由于开发周期短,时间紧,缺乏接口文档,直接使用swagger记录所有接口信息.那么: 1. 我们如何更快的测试动辄300+数量的接口,如何分组管理和维护这些接口? ... 
