• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
KK筑梦人
博客园    首页    新随笔    联系   管理    订阅  订阅

(序列化模块、包)复习 第十五天 2018.10.31

序列化:都是转向一个字符串数据类型

序列化:将一个字典转换成一个字符串

反序列化:将一个字符串格式的字典转换成一个字典

序列就是字符串

写文件(数据存储时---->写文件/数据库)

网络上传输时---->bytes

从数据类型---->字符串 序列化

从字符串---->数据类型 反序列化

#json*****

#pickle****

#shelve***

3者相互区别:

'''
#json: 数字、字符串、列表、字典、元组(会被当成列表操作,转换回后显示为列表类型)、集合无法操作
       通用的序列化格式
       只有很少的一部分数据类型能够通过json转化成字符串

#pickle:(bytes)
       所有的Python中的数据类型都可以转化成字符串格式
       pickle序列化的内容只有Python能理解
       且部分反序列化依赖Python代码(例:游戏人物状态存储等)
       和json的dumps、loads用法一样;dump、load建立文件,写读文件时间需要用rb模式
       可以分步dump和分步load
#shelve:
       序列化句柄
       使用句柄直接操作,非常方便     
'''

json:数字 字符串 列表 字典 可以进行序列化和反序列化 ★集合无法被json序列化

元组 ---->转化为列表序列化 (会被自动当成列表序列化,转换回来为列表类型)

loads和dumps是直接操作内存中的数据类型

load和dump是往文件里写

json dumps序列化方法 loads反序列化方法

正常时间字典中keys和values如果是字符串类型打印出来为单引号

转化为字符串类型时间打印出来为双引号

json本身是单引号的,内部的所有字符串元素都需要用双引号引起

dumps、loads

import json
dic = {'k1':'v1','k2':'v2','k3':'v3'}
str_dic = json.dumps(dic)  #序列化:将一个字典转换成一个字符串
print(type(str_dic),str_dic)  #<class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"}
#注意,json转换完的字符串类型的字典中的字符串是由""表示的

dic2 = json.loads(str_dic)  #反序列化:将一个字符串格式的字典转换成一个字典
#注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示
print(type(dic2),dic2)  #<class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}

list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}]
str_dic = json.dumps(list_dic) #也可以处理嵌套的数据类型
print(type(str_dic),str_dic) #<class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}]
list_dic2 = json.loads(str_dic)
print(type(list_dic2),list_dic2) #<class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]

dump load

ensure_ascii=False  默认ASCII为true,把ASCII码改为false,计算机就会按正常编码写入

import json
dic={'1':'中国','2':'tgv'}
f=open('fff','w',encoding='utf-8')
json.dump(dic,f,ensure_ascii=False)   #直接执行utf-8会把中文编码为bytes
#ensure_ascii=False,默认ASCII为true,把ASCII码改为false,计算机就会按正常编码写入
f.close()   #json.dump先序列化再传入---->先把字典序列化为字符串,后传入文件

f=open('fff',encoding='utf-8')
res=json.load(f)
#win操作系统默认gbk编码;
f.close()
print(type(res),res)  #直接读

dump,load一次性写进去,一次性读出来

分次写入文件读出文件---->绕开dump和load

json

dumps {} -- > '{}\n'   #换行

一行一行的读

'{}\n'

'{}' loads

l = [{'k':'111'},{'k2':'111'},{'k3':'111'}]
f = open('file','w')
import json
for dic in l:
    str_dic = json.dumps(dic)
    f.write(str_dic+'\n')
f.close()

f = open('file')
import json
l = []
for line in f:
    dic = json.loads(line.strip())
    l.append(dic)
f.close()
print(l)

json格式化:

sort_keys、separators、indent、ensure_ascii、Skipkeys

import json
data = {'username':['李华','二愣子'],'sex':'male','age':16}
json_dic2 = json.dumps(data,sort_keys=True,indent=2,separators=(',',':'),ensure_ascii=False)
print(json_dic2)

'''
sort_keys:将数据根据keys的值进行排序。 
separators:分隔符,实际上是(item_separator, dict_separator)的一个元组,默认的就是(‘,’,’:’);
这表示dictionary内keys之间用“,”隔开,而KEY和value之间用“:”隔开。
indent:应该是一个非负的整型,如果是0就是顶格分行显示,如果为空就是一行最紧凑显示,
否则会换行且按照indent的数值显示前面的空白分行显示,这样打印出来的json数据也叫pretty-printed json 
ensure_ascii:,当它为True的时候,所有非ASCII码字符显示为\uXXXX序列,只需在dump时将ensure_ascii设置为False即可,
此时存入json的中文即可正常显示。) 
Skipkeys:默认值是False,如果dict的keys内的数据不是python的基本类型(str,unicode,int,long,float,bool,None),
设置为False时,就会报TypeError的错误。此时设置成True,则会跳过这类key 

'''

shelve:

#writeback=True
#shelve.open('shelve_file', writeback=True)
#可以让用户的修改直接显示
#在open时会产生额外的内存,在DBclose时间会把每个对象都写入到DB,增加额外等待时间

文件代码导入模块顺序:

内置模块

扩展的 django

自定义的

模块导入时间Python内部顺序:

先从sys.modules里查看是否已经被导入

如果没有被导入,就依据sys.path路径取寻找模块

找到了就导入

创建这个模块的命名空间

执行文件,把文件中的名字都放到命名空间里

给模块起别名(重命名,重命名后之前名字无法使用)import...as...

import time as t
print(t.time()) 

例如:两个模块提供的方法相同,可以用一套代码操作两种数据库---->提高代码的兼容性

oracle
mysql
if 数据库 == ‘oracle’:
    import oracle as db
elif 数据库 == ‘mysql’:
    import mysql as db
# 连接数据库   db.connect
# 登录认证
# 增删改查
# 关闭数据库

小结:  

'''
所有的模块导入都应该尽量往上写
    内置模块
    扩展模块
    自定义模块
模块不会重复被导入 : sys.moudles
从哪儿导入模块 : sys.path
import
import 模块名
    模块名.变量名 和本文件中的变量名完全不冲突
import 模块名 as 重命名的模块名 : 提高代码的兼容性
import 模块1,模块2

from import
from 模块名 import 变量名
    直接使用 变量名 就可以完成操作
    如果本文件中有相同的变量名会发生冲突
from 模块名 import 变量名字 as 重命名变量名
from 模块名 import 变量名1,变量名2
from 模块名 import *
    将模块中的所有变量名都放到内存中
    如果本文件中有相同的变量名会发生冲突
from 模块名 import * 和 __all__ 是一对
    没有这个变量,就会导入所有的名字
    如果有all 只导入all列表中的名字
__name__
在模块中 有一个变量__name__,
当我们直接执行这个模块的时候,__name__ == '__main__'
当我们执行其他模块,在其他模块中引用这个模块的时候,这个模块中的__name__ == '模块的名字'
'''

之前复习:  

序列化模块:json、pickle、shelve

# 序列化模块
    # 数据类型转化成字符串的过程就是序列化
    # 为了方便存储和网络传输
    # json
        # dumps
        # loads
        # dump  和文件有关
        # load  load不能load多次

    # pickle
        #方法和json一样
        #dump和load的时候 文件是rb或者wb打开的
        #支持python所有的数据类型
        #序列化和反序列化需要相同的环境
    # shelve
        # open方法
        # open方法获取了一个文件句柄
        # 操作和字典类似

模块的导入

import

from import

as重命名

都支持多名字导入

sys.moudles记录了所有被导入的模块

sys.path 记录了导入模块的时候寻找的所有路径

 

把解决一类问题的模块放在同一文件夹里---->包(导入包执行,如果没注明,则默认执行__init__.py文件)

Python2中没自带的__init__.py文件不能是包--->报错

Python3中对此无要求

导入包时,包默认执行的是__init__.py文件

import os
os.makedirs('glance/api')   #makedirs:生成多层递归目录
os.makedirs('glance/cmd')   
os.makedirs('glance/db')
l = []                      #将以下文件的句柄都加入到列表中
l.append(open('glance/__init__.py','w'))   #括号中为获得该文件句柄
l.append(open('glance/api/__init__.py','w'))
l.append(open('glance/api/policy.py','w'))
l.append(open('glance/api/versions.py','w'))
l.append(open('glance/cmd/__init__.py','w'))
l.append(open('glance/cmd/manage.py','w'))
l.append(open('glance/db/models.py','w'))
map(lambda f:f.close() ,l)  #map内置函数对列表中所有的句柄进行操作,从而关闭所有的文件

凡是在导入时带点的,点的左边都必须是一个包

需要注意的是from后import导入的模块,必须是明确的一个不能带点,否则会有语法错误,如:from a import b.c是错误语法

import glance.api.policy # as g
glance.api.policy.register_models('mysql') 
from dir.glance.api import policy
policy.get()

  

posted @ 2018-10-31 21:24  KK筑梦人  阅读(115)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3