http://www.cnblogs.com/Eva-J/articles/7228075.html#_label9
序列化模块
为什么要序列化?
数据存储
网络上传输的时候
从数据类型 --> 字符串的过程 序列化
从字符串 --> 数据类型的过程 反序列化
json --通用的序列化格式
通用的序列化格式
只有很少的一部分数据类型能够通过json转化成字符串
pickle
所有的python中的数据类型都可以转化成字符串形式
pickle序列化的内容只有python能理解
且部分反序列化依赖python代码
shelve
比较新
序列化句柄
使用句柄直接操作,非常方便
json
数字 字符串 列表 字典 元组
dumps -- 序列化
loads --- 反序列化
直接在内存中执行
import json dic = {1:"a",2:'b'} print(type(dic),dic) str_d = json.dumps(dic) # 序列化 print(type(str_d),str_d) # str {"k": "v1"} 双引号 # '{"kkk":"v"}' dic_d = json.loads(str_d) # 反序列化 print(type(dic_d),dic_d) # 元组序列化后变成列表字符化,反序列化后还是列表 # 集合不能序列化
dump load
可以写入文件
import json f = open('json_file','w') dic = {'k1':'v1','k2':'v2','k3':'v3'} json.dump(dic,f) #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件 f.close() f = open('json_file') dic2 = json.load(f) #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回 f.close() print(type(dic2),dic2)
import json f = open('file','w') json.dump({'国籍':'中国'},f) ret = json.dumps({'国籍':'中国'}) f.write(ret+'\n') json.dump({'国籍':'美国'},f,ensure_ascii=False) # json中的是汉字 不加的话会是bytes编码 ret = json.dumps({'国籍':'美国'},ensure_ascii=False) f.write(ret+'\n') f.close()
模块
模块导入顺序:
内置模块
扩展的 比如django
自定义的
模块级别函数定义的执行将函数名放入模块全局名称空间表,用globals()可以查看
为了防止重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载大内存中的模块对象增加了一次引用,不会重新执行模块内的语句。
定义一个模块:
#my_module.py print('from the my_module.py') money=1000 def read1(): print('my_module->read1->money',money) def read2(): print('my_module->read2 calling read1') read1() def change(): global money money=0
我们可以从sys.modules中找到当前已经加载的模块,sys.modules是一个字典,内部包含模块名与模块对象的映射,该字典决定了导入模块时是否需要重新导入。
先从sys.modules里查看是否已经被导入
如果没有被导入,就依据sys.path路径取寻找模块
找到了就导入
创建这个模块的命名空间
执行文件,把文件中的名字都放到命名空间里
#demo.py import my_module #只在第一次导入时才执行my_module.py内代码,此处的显式效果是只打印一次'from the my_module.py',当然其他的顶级代码也都被执行了,只不过没有显示效果. import my_module import my_module import my_module ''' 执行结果: from the my_module.py '''
每个模块都是一个独立的名称空间,定义在这个模块中的函数,把这个模块的名称空间当做全局名称空间,这样我们在编写自己的模块时,就不用担心我们定义在自己模块中全局变量会在被导入时,与使用者的全局变量冲突
- 使用import demo导入模块,会创建一个独立的命名空间,里面的所有函数都被导入进来,再定义一个和demo中函数名一样的函数,就无效
- 使用from...import...导入,再定义一个和demo中函数名一样的函数,导入的函数就被覆盖
from my_module import * 把my_module中所有的不是以下划线(_)开头的名字都导入到当前位置,大部分情况下我们的python程序不应该使用这种导入方式,因为*你不知道你导入什么名字,很有可能会覆盖掉你之前已经定义的名字。而且可读性极其的差,在交互式环境中导入时没有问题。
在my_module.py中新增一行
__all__=['money','read1'] #这样在另外一个文件中用from my_module import *就这能导入列表中规定的两个名字