模块之内置模块

内置模块

collections模块(一些扩展的数据类型)
一些数据类型(类):

namedtuple---可命名元组,生成可以使用名字来访问元素内容的tuple
导入:from collections import namedtuple
P = namedtuple("point",["x","y","z"])---P,point,和后面列表里的都是可以定义的
print(p.x)
用途:坐标,求圆的面积

deque---双端队列,可以快速的从另外一侧追加和推出对象
deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:
队列:先进先出
from collections import deque

q = deque(['a', 'b', 'c'])
q.append('x') #- --功能1
q.appendleft('y') #- --功能2
print(q)
q.pop() #- --功能3
print(q)
q.popleft() #- --功能4
print(q)
Code

 

  OrderdDict--- 有序字典

d = dict([('a', 1), ('b', 2), ('c', 3)])#---正常创建字典的方法

from collections import OrderedDict

od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])  # ---od是有序的
print(od)

from collections import OrderedDict

od = OrderedDict()
od['z'] = 1
od['y'] = 2
od['x'] = 3
print(od.keys())  # 按照插入的Key的顺序返回
Code

 

  defaultdict-- 带有默认值的字典

使用dict时,如果引用的Key不存在,就会抛出KeyError。
如果希望key不存在时,返回一个默认值,就可以用defaultdict
# 有如下值集合 [11,22,33,44,55,66,77,88,99,90...],
# 将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。
# 即: {'k1': 大于66 , 'k2': 小于66}
from collections import defaultdict
values = [11, 22, 33,44,55,66,77,88,99,90]
my_dict = defaultdict(list)
for value in  values:
    if value>66:
        my_dict['k1'].append(value)
    else:
        my_dict['k2'].append(value)
print(my_dict)
Code

 

  Counter-- 计数器,主要用来计数
Counter类的目的是用来跟踪值出现的次数。
它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。
计数值可以是任意的Interger(包括0和负数)。Counter类和其他语言的bags或multisets很相似。

from collections import Counter

c = Counter('abcdeabcdabcaba')
print(c)
Code

 

*****时间模块
表示时间的三种方式:时间戳,元组(struct_time),格式化的时间字符串
(1)时间戳(Timestamp) :通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。
我们运行“type(time.time())”,返回的是float类型。
import time

time.time()  # ---时间戳,计算,标识一个唯一的时间

 

(2)格式化的时间字符串(Format String)字符串时间: ‘1999-12-06’
格式化时间 Format String
import time

print(time.strftime("%Y-%m-%d %H-%m-%s"))  # ---时间字符串--给用户看的

 

%y 两位数的年份表示(00-99%Y 四位数的年份表示(000-9999%m 月份(01-12%d 月内中的一天(0-31%H 24小时制小时数(0-23%I 12小时制小时数(01-12%M 分钟数(00=59%S 秒(00-59%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身

python中时间日期格式化符号:
python中时间日期格式化符号:

 

(3)元组(struct_time)结构化时间 :struct_time元组共有9个元素共九个元素:
(年,月,日,时,分,秒,一年中第几周,一年中第几天等)

import time

print(time.localtime())  # ---时间元组--计算
# 结果time.struct_time(tm_year=2017, tm_mon=9, tm_mday=13,
# tm_hour=15, tm_min=58, tm_sec=6,
# tm_wday=2, tm_yday=256, tm_isdst=0)

 

小结:时间戳是计算机能够识别的时间;时间字符串是人能够看懂的时间;元组则是用来操作时间的

三种格式之间的转换:
元组(struct_time)--(strftime)-->格式化的时间字符串(Format String)
格式化的时间字符串(Format String)--(strptime)-->元组(struct_time)
# time.strftime("格式定义", "结构化时间")
# 结构化时间参数若不传,则现实当前时间
import time

print(time.strftime("%Y-%m-%d %X"))
# 结果2017-09-13 16:12:31
print(time.strftime("%Y-%m-%d", time.localtime(1500000000)))
# 结果:2017-07-14
# 结构化时间 -->字符串时间
# time.strptime(时间字符串, 字符串对应格式)
import time

print(time.strptime("2017-03-16", "%Y-%m-%d"))
# 结果:time.struct_time(tm_year=2017, tm_mon=3, tm_mday=16, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=75, tm_isdst=-1)
print(time.strptime("07/24/2017", "%m/%d/%Y"))
# 结果: time.struct_time(tm_year=2017, tm_mon=7, tm_mday=24, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=205, tm_isdst=-1)
# 字符串时间 -->结构化时间

 

    元组(struct_time)--(mktime)-->时间戳(timestamp)
时间戳(timestamp)--(localtime/gmtime)-->元组(struct_time)

# time.gmtime(时间戳)  # UTC时间,与英国伦敦当地时间一致
# time.localtime(时间戳)  # 当地时间。例如我们现在在北京执行这个方法:与UTC时间相差8小时,UTC时间+8小时 = 北京时间
import time

print(time.gmtime(1500000000))
# 结果: time.struct_time(tm_year=2017, tm_mon=7, tm_mday=14, tm_hour=2, tm_min=40, tm_sec=0, tm_wday=4, tm_yday=195, tm_isdst=0)
print(time.localtime(1500000000))
# 结果: time.struct_time(tm_year=2017, tm_mon=7, tm_mday=14, tm_hour=10, tm_min=40, tm_sec=0, tm_wday=4, tm_yday=195, tm_isdst=0)
# 时间戳 -->结构化时间
# time.mktime(结构化时间)
import time

time_tuple = time.localtime(1500000000)
print(time.mktime(time_tuple))
# 结果:1500000000.0
# 结构化时间 -->时间戳 

 

  计算时间差

import time
true_time=time.mktime(time.strptime('2017-09-11 08:30:00','%Y-%m-%d %H:%M:%S'))
time_now=time.mktime(time.strptime('2017-09-12 11:00:00','%Y-%m-%d %H:%M:%S'))
dif_time=time_now-true_time
struct_time=time.gmtime(dif_time)
print('过去了%d年%d月%d天%d小时%d分钟%d秒'%(struct_time.tm_year-1970,struct_time.tm_mon-1,
                                       struct_time.tm_mday-1,struct_time.tm_hour,
                                       struct_time.tm_min,struct_time.tm_sec))
计算时间差

 

random模块(随机,生成验证码,洗牌)
import random
#随机小数
print(random.random())      # 大于0且小于1之间的小数

print(random.uniform(1,3)) #大于1小于3的小数

随机整数
import random
print(random.randint(1,5))  # 大于等于1且小于等于5之间的整数
print(random.randrange(1,10,2)) # 大于等于1且小于10之间的奇数

随机选择一个返回
import random
print(random.choice([1,'23',[4,5]])) #---参数是一个可迭代对象

随机选择多个返回,返回的个数为函数的第二个参数
import random
print(random.sample([1,'23',[4,5]],2)) # #列表元素任意2个组合

打乱列表顺序
import random
item=[1,3,5,7,9]
random.shuffle(item) # 打乱次序(洗牌)
print(item)
常用功能

 

随机生成验证码    #大写字母65-90 小写字母97-122
import random
def func(n):
    ret = ""
    for i in range(n):
        num = random.randint(0,9)
        ALPHA = chr(random.randint(65,90))
        alpha = chr(random.randint(97,122))
        value = random.choice([str(num),ALPHA,alpha])
        ret += value
    return ret

print(func(6))
随机生成验证码

 





sys模块--和python解释器相关的模块(退出python程序,获取文件执行时的参数)

sys模块是与python解释器交互的一个接口
sys.argv 命令行参数List,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1)
sys.version 获取Python解释程序的版本信息
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
import sys

print(sys.argv)  # ---在Terminal中传参数时使用,第一个元素是文件路径
print(sys.version)  # ---查看Python解释器版本
sys.exit()  # ---退出
sys.path()  # --查看模块
print(sys.platform)
Code

 

os模块(和操作系统相关的,文件夹和文件的路径和创建删除,执行系统命令)
和文件夹相关的
和路径相关的
和文件相关的
和操作系统相关的
系统执行命令相关的
import os
os.getcwd()#----当前的目录
os.chdir(r'路径')#----有r不能加\

os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cd
os.curdir  返回当前目录: ('.')
os.pardir  获取当前目录的父目录字符串名:('..')
os.makedirs('dirname1/dirname2')    可生成多层递归目录
os.removedirs('dirname1')    若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname')    生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname')    删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname')    列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove()  删除一个文件
os.rename("oldname","newname")  重命名文件/目录
os.stat('path/filename')  获取文件/目录信息
os.sep    输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep    输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep    输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name    输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("bash command")  运行shell命令,直接显示
os.popen("bash command)  运行shell命令,获取执行结果
os.environ  获取系统环境变量


os.path
os.path.abspath(path) 返回path规范化的绝对路径
os.path.split(path) 将path分割成目录和文件名二元组返回
    os.path.dirname(path) 返回path的目录。# 其实就是os.path.split(path)的第一个元素
    os.path.basename(path) 返回path最后的文件名。# 如果path以/或\结尾,那么就会返回空值。
                                                  即os.path.split(path)的第二个元素
os.path.exists(path)  如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path)  如果path是绝对路径,返回True
os.path.isfile(path)  如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path)  如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path)  返回path所指向的文件或者目录的最后访问时间
os.path.getmtime(path)  返回path所指向的文件或者目录的最后修改时间
os.path.getsize(path) 返回path的大小
类内功能:

 

注意:os.stat('path/filename')  获取文件/目录信息 的结构说明
st_mode: inode 保护模式
st_ino: inode 节点号。
st_dev: inode 驻留的设备。
st_nlink: inode 的链接数。
st_uid: 所有者的用户ID。
st_gid: 所有者的组ID。
st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。
st_atime: 上次访问的时间。
st_mtime: 最后一次修改的时间。
st_ctime: 由操作系统报告的"ctime"。
      在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。
stat 结构:

 

*****序列化模块(数据类型和str之间的转换,数据持久化-存储,网络交互-传输)
将原本的字典,列表转换成一个字符串的过程就叫做序列化
本质--将程序中的数据类型转成str

json*****--存文件,网络传输
只提供了四个功能:
序列化--dump,dumps
反序列化--load,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'}]
loads和dumps
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)
load和dump
import json

f = open('file', 'w')
json.dump({'国籍': '中国'}, f)
ret = json.dumps({'国籍': '中国'})
f.write(ret + '\n')
json.dump({'国籍': '美国'}, f, ensure_ascii=False)
ret = json.dumps({'国籍': '美国'}, ensure_ascii=False)
f.write(ret + '\n')
f.close()
ensure_ascii关键字参数

 


pickle 模块
pickle,用于python特有的类型 和 python的数据类型间进行转换
pickle模块提供了四个功能:dumps、dump(序列化,存)、loads(反序列化,读)、load  
(不仅可以序列化字典,列表...可以把python中任意的数据类型序列化)
pickle--只能写进去,不能追加
import pickle

dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
str_dic = pickle.dumps(dic)
print(str_dic)  # 一串二进制内容

dic2 = pickle.loads(str_dic)
print(dic2)  # 字典

import time

struct_time = time.localtime(1000000000)
print(struct_time)
f = open('pickle_file', 'wb')
pickle.dump(struct_time, f)
f.close()

f = open('pickle_file', 'rb')
struct_time2 = pickle.load(f)
print(struct_time2.tm_year)
Code

 

json & pickle 模块比较
用于序列化的两个模块:
json,用于字符串 和 python数据类型间进行转换
pickle,用于python特有的类型 和 python的数据类型间进行转换
pickle模块提供了四个功能:dumps、dump(序列化,存)、loads(反序列化,读)、load  
(不仅可以序列化字典,列表...可以把python中任意的数据类型序列化)

json--能处理的很少
pickle--可以序列化python里没有的,自己定义了一个数据类型,

pickle---可以序列化一些自定义的数据类型--游戏
json---是所有p编程语言通用的一种数据类型---网络编程


shelve---只提供了open 方法
shelve也是python提供给我们的序列化工具,比pickle用起来更简单一些。
shelve只提供给我们一个open方法,是用key来访问的,使用起来和字典类似。

import shelve

f = shelve.open('shelve_file')
f['key'] = {'int': 10, 'float': 9.5, 'string': 'Sample data'}  # 直接对文件句柄操作,就可以存入数据
f.close()

import shelve

f1 = shelve.open('shelve_file')
existing = f1['key']  # 取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错
f1.close()
print(existing)
Code

 

    这个模块有个限制,它不支持多个应用同一时间往同一个DB进行写操作。
所以当我们知道我们的应用如果只进行读操作,可以让shelve通过只读方式打开DB
import shelve

f = shelve.open('shelve_file', flag='r')
existing = f['key']
f.close()
print(existing)
Code

 

    由于shelve在默认情况下是不会记录待持久化对象的任何修改的,所以我们在shelve.open()时候需要修改默认参数,否则对象的修改不会保存。
import shelve
f1 = shelve.open('shelve_file')
print(f1['key'])
f1['key']['new_value'] = 'this was not here before'
f1.close()

f2 = shelve.open('shelve_file', writeback=True)
print(f2['key'])
f2['key']['new_value'] = 'this was not here before'
f2.close()
设置writeback

 

    writeback方式有优点也有缺点。优点是减少了我们出错的概率,并且让对象的持久化对用户更加的透明了;但这种方式并不是所有的情况下都需要,
首先,使用writeback以后,shelf在open()的时候会增加额外的内存消耗,并且当DB在close()的时候会将缓存中的每一个对象都写入到DB,这也会带来额外的等待时间。
因为shelve没有办法知道缓存中哪些对象修改了,哪些对象没有修改,因此所有的对象都会被写入










posted @ 2017-09-13 19:26  chitalu  阅读(123)  评论(0)    收藏  举报