python学习day20 序列化模块 模块的导入

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 *就这能导入列表中规定的两个名字

猜你喜欢

转载自www.cnblogs.com/happyfan/p/9932026.html