1. collections模块
在内置数据类型(dict、list、set、tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple和OrderedDict等。
1.1 namedtuple
namedtuple: 生成可以使用名字来访问元素内容的tuple
范例1:
我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成:
p = (1, 2)
但是,看到(1, 2),很难看出这个tuple是用来表示一个坐标的。
这时,namedtuple就派上了用场:
from collections import namedtuple
Point = namedtuple('point',['x','y','z'])
p1 = Point(1,2,3)
p2 = Point(3,2,1)
print(p1.x)
print(p1.y)
print(p1,p2)
执行结果:
1
2
point(x=1, y=2, z=3) point(x=3, y=2, z=1)
范例2:
花色和数字
from collections import namedtuple
Card = namedtuple('card',['suits','number'])
c1 = Card('红桃',2)
print(c1)
print(c1.number)
print(c1.suits)
执行结果:
card(suits='红桃', number=2)
2
红桃
1.2 deque
deque: 双端队列,可以快速的从另外一侧追加和推出对象
范例1:队列(队列的含义为先进先出,英文表示为FIFO)
import queue
q = queue.Queue()
q.put(10)
q.put(5)
q.put(6)
print(q.get())
print(q.get())
print(q.get())
print(q.get()) # 阻塞
执行结果:
10
5
6
范例2:队列2
q = queue.Queue()
q.put([1,2,3])
q.put(5)
q.put(6)
print(q)
print(q.get())
print(q.qsize())
执行结果:
<queue.Queue object at 0x000000000320C4A8>
[1, 2, 3]
2
范例3:双端队列(不推荐使用)
from collections import deque
dq = deque([1,2])
dq.append('a') # 从后面放数据 [1,2,'a']
dq.appendleft('b') # 从前面放数据 ['b',1,2,'a']
dq.insert(2,3) #['b',1,3,2,'a'] # 办公电脑没有insert
print(dq.pop()) # 从后面取数据
print(dq.pop()) # 从后面取数据
print(dq.popleft()) # 从前面取数据
print(dq)
执行结果:
a
2
b
deque([1, 3])
1.3 OrderedDict
OrderedDict: 有序字典
使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。
如果要保持Key的顺序,可以用OrderedDict:
from collections import OrderedDict
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(od) # OrderedDict的Key是有序的
print(od['a'])
for k in od:
print(k)
执行结果:
OrderedDict([('a', 1), ('b', 2), ('c', 3)])
1
a
b
c
1.4 defaultdict
defaultdict: 带有默认值的字典
范例1:
有如下值集合 [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)
执行结果:
defaultdict(<class 'list'>, {'k2': [11, 22, 33, 44, 55, 66], 'k1': [77, 88, 99, 90]})
范例2:
使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict:
from collections import defaultdict
d = defaultdict(lambda : None)
print(d['k'])
执行结果:
None
1.5 Counter
Counter: 计数器,主要用来计数
Counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)。Counter类和其他语言的bags或multisets很相似。
范例:
from collections import Counter
c = Counter('abcdeabcdabcaba')
print(c)
#输出:Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
执行结果:
Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
2. 时间模块
2.1 表示时间的三种方式
1)时间戳(timestamp) :通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。
范例:
import time
print(time.time())
执行结果:
1548745700.744755
2)格式化的时间字符串(Format String): ‘1999-12-06’
范例:
import time
print(time.strftime("%Y-%m-%d %a %H:%M:%S")) #year month day HOUR MINUTE SECOND
print(time.strftime("%Y/%m/%d %H:%M:%S")) #year month day HOUR MINUTE SECOND
print(time.strftime("%m-%d %H:%M:%S")) #year month day HOUR MINUTE SECOND
print(time.strftime("%H:%M:%S")) #year month day HOUR MINUTE SECOND
print(time.strftime("%H:%M")) #year month day HOUR MINUTE SECOND
执行结果:
2019-01-29 Tue 15:23:39
2019/01/29 15:23:39
01-29 15:23:39
15:23:39
15:23
3)元组(struct_time) :struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天等)
import time
struct_time = time.localtime()
print(struct_time)
print(struct_time.tm_year)
执行结果:
time.struct_time(tm_year=2019, tm_mon=1, tm_mday=29, tm_hour=15, tm_min=26, tm_sec=47, tm_wday=1, tm_yday=29, tm_isdst=0)
2019
2.2 三种时间表达方式的用途
格式化时间 —— 字符串: 给人看的
时间戳时间 —— float时间 : 计算机看的
结构化时间 —— 元祖 :计算用的
2.3 时间戳和结构化时间
范例1:
t = time.time()
print(time.localtime(t)) # 结构化时间
print(time.gmtime(t))
执行结果:
time.struct_time(tm_year=2019, tm_mon=1, tm_mday=29, tm_hour=16, tm_min=36, tm_sec=11, tm_wday=1, tm_yday=29, tm_isdst=0)
time.struct_time(tm_year=2019, tm_mon=1, tm_mday=29, tm_hour=8, tm_min=36, tm_sec=11, tm_wday=1, tm_yday=29, tm_isdst=0)
范例2:
t = time.time()
print(t)
print(time.localtime(1500000000))
print(time.gmtime(t))
执行结果:
1548751146.404482
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.struct_time(tm_year=2019, tm_mon=1, tm_mday=29, tm_hour=8, tm_min=39, tm_sec=6, tm_wday=1, tm_yday=29, tm_isdst=0)
范例3:
mktime:结构化时间转换成时间戳时间
print(time.mktime(time.localtime()))
执行结果:
1548751428.0
范例4:
struct_time:格式化时间转换成结构化时间
print(time.strptime('2000-12.31','%Y-%m.%d'))
执行结果:
time.struct_time(tm_year=2000, tm_mon=12, tm_mday=31, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=366, tm_isdst=-1)
范例5:
结构化时间转换成格式化时间
print(time.strftime('%m/%d/%Y %H:%M:%S', time.localtime(3000000000)))
执行结果:
01/24/2065 13:20:00
范例6:
print(time.asctime())
执行结果:
Tue Jan 29 17:05:24 2019
3. random模块
网站例子:
>>> import random
#随机小数
>>> random.random() # 大于0且小于1之间的小数
0.7664338663654585
>>> random.uniform(1,3) #大于1小于3的小数
1.6270147180533838
#恒富:发红包
#随机整数
>>> random.randint(1,5) # 大于等于1且小于等于5之间的整数
>>> random.randrange(1,10,2) # 大于等于1且小于10之间的奇数
#随机选择一个返回
>>> random.choice([1,'23',[4,5]]) # #1或者23或者[4,5]
#随机选择多个返回,返回的个数为函数的第二个参数
>>> random.sample([1,'23',[4,5]],2) # #列表元素任意2个组合
[[4, 5], '23']
#打乱列表顺序
>>> item=[1,3,5,7,9]
>>> random.shuffle(item) # 打乱次序
>>> item
[5, 1, 3, 7, 9]
>>> random.shuffle(item)
>>> item
[5, 9, 7, 1, 3]
3.1 练习:生成随机验证码
思路:
# 1234 432145
# Abc123 a17698
# 0-9
# chr
# [65-90] 数字
# 字母 = chr(数字)
# 随机数字
# 随机选一个 [随机数字,随机字母]
import random
def v_code():
code = ''
for i in range(5):
num=random.randint(0,9)
alf=chr(random.randint(65,90))
add=random.choice([num,alf])
code="".join([code,str(add)])
return code
print(v_code())
执行结果:
6K26C
4. os模块
4.1 os.getcwd()
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
范例:
import os
print(os.getcwd())
执行结果:
E:\python_project\muggle
4.2 os.chdir("dirname")
os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
import os
print(os.getcwd())
os.chdir(r'E:\python_project')
print(os.getcwd())
os.chdir('..') # 直接返回上一级目录
print(os.getcwd())
执行结果:
E:\python_project\muggle
E:\python_project
E:\
4.3 os.makedirs() 与 os.removedirs()
os.makedirs('dirname1/dirname2') 可生成多层递归目录
os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
范例:
import os
os.makedirs('dirname1/dirname2')
os.removedirs('dirname1/dirname2')
4.4 os.mkdir() 与 os.rmdir()
os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
范例:
import os
os.mkdir('dirname')
os.rmdir('dirname')
4.5 os.listdir()
os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
范例:
import os
print(os.listdir(r'E:\python_project\muggle'))
执行结果:
['.idea', '1.复习.py', 'file', 'move_info7', 'muggle_test.py', 'venv']
4.6 os.stat('')
os.stat('path/filename') 获取文件/目录信息
范例:
import os
print(os.stat('1.复习.py'))
执行结果:
os.stat_result(st_mode=33206, st_ino=16325548649219716, st_dev=3189114841, st_nlink=1, st_uid=0, st_gid=0, st_size=1072, st_atime=1547383023, st_mtime=1547348253, st_ctime=1547383023)
4.7 os.sep
os.sep 输出操作系统特定的路径分隔符,win下为"\",Linux下为"/"
范例:
import os
print(os.sep) # python代码跨平台 :linux windows
执行结果:
\
4.8 os.system()
os.system("bash command") 运行shell命令,直接显示
范例:
import os
os.system("dir")
执行结果:
������ E �еľ�û�б�ǩ��
�������� BE16-07D9
E:\python_project\muggle ��Ŀ¼
2019/01/29 23:01 <DIR> .
2019/01/29 23:01 <DIR> ..
2019/01/29 22:52 <DIR> .idea
2019/01/13 10:57 1,072 1.��ϰ.py
2019/01/06 14:15 70 file
2019/01/27 10:55 22,655 move_info7
2019/01/29 23:01 54 muggle_test.py
2019/01/06 14:09 <DIR> venv
4 ���ļ� 23,851 �ֽ�
4 ��Ŀ¼ 480,761,966,592 �����ֽ�
4.9 os.popen("bash command).read()
os.popen("bash command).read() 运行shell命令,获取执行结果
范例:
import os
ret = os.popen("dir").read()
print(ret)
执行结果:
驱动器 E 中的卷没有标签。
卷的序列号是 BE16-07D9
E:\python_project\muggle 的目录
2019/01/29 23:06 <DIR> .
2019/01/29 23:06 <DIR> ..
2019/01/29 23:01 <DIR> .idea
2019/01/13 10:57 1,072 1.复习.py
2019/01/06 14:15 70 file
2019/01/27 10:55 22,655 move_info7
2019/01/29 23:06 78 muggle_test.py
2019/01/06 14:09 <DIR> venv
4 个文件 23,875 字节
4 个目录 480,761,966,592 可用字节
4.10 os.environ
os.environ 获取系统环境变量
范例:
import os
print(os.environ)
执行结果:
environ({'ALLUSERSPROFILE': 'C:\\ProgramData', 'APPDATA': 'C:\\Users\\rock\\AppData\\Roaming', 'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files', 'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files', 'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files', 'COMPUTERNAME': 'DESKTOP-DKJ14L4', 'COMSPEC': 'C:\\WINDOWS\\system32\\cmd.exe', 'DRIVERDATA': 'C:\\Windows\\System32\\Drivers\\DriverData',
...
4.11 os.path.split(path)
os.path.split(path) 将path分割成目录和文件名二元组返回
范例:
import os
print(os.getcwd())
print(os.path.split(os.getcwd()))
执行结果:
E:\python_project\muggle
('E:\\python_project', 'muggle')
4.12 os.path.join(path1[, path2[, ...]])
os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
范例:
import os
print(os.path.join(r'C:\Users\Administrator','user','local'))
执行结果:
C:\Users\Administrator\user\local
4.13 os.path.getsize(path)
os.path.getsize(path) 返回path的大小
范例:
import os
print(os.getcwd())
print(os.path.getsize(os.getcwd()))
print(os.getcwd())
print(os.path.getsize(os.path.join(os.getcwd(),'1.复习.py')))
执行结果:
E:\python_project\muggle
4096
E:\python_project\muggle
1072
5. sys模块
sys模块是与python解释器交互的一个接口
5.1 sys.exit(n)
sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1)
import sys
sys.exit(1)
5.2 sys.version 与 sys.platform
sys.version 获取Python解释程序的版本信息
sys.platform 返回操作系统平台名称
范例:
import sys
print(sys.platform)
print(sys.version)
执行结果:
win32
3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)]
5.3 sys.path
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
范例:
import sys
print(sys.path)
执行结果:
['E:\\python_project\\muggle', 'E:\\python_project\\muggle', 'E:\\python_project\\muggle\\venv\\Scripts\\python36.zip', 'D:\\Program Files\\Python\\Python36\\DLLs', 'D:\\Program Files\\Python\\Python36\\lib', 'D:\\Program Files\\Python\\Python36', 'E:\\python_project\\muggle\\venv', 'E:\\python_project\\muggle\\venv\\lib\\site-packages', 'E:\\python_project\\muggle\\venv\\lib\\site-packages\\setuptools-39.1.0-py3.6.egg', 'E:\\python_project\\muggle\\venv\\lib\\site-packages\\pip-10.0.1-py3.6.egg', 'D:\\Program Files\\JetBrains\\PyCharm 2018.1.3\\helpers\\pycharm_matplotlib_backend']
5.4 sys.argv
sys.argv 命令行参数List,第一个元素是程序本身路径
范例:
import sys
ret = sys.argv
name = ret[1]
pwd = ret[2]
if name == 'alex' and pwd == 'alex3714':
print('登陆成功')
else:
print("错误的用户名和密码")
sys.exit()
print('你可以使用计算器了')
执行结果:
(venv) E:\python_project\muggle>python muggle_test.py alex alex123
错误的用户名和密码
(venv) E:\python_project\muggle>python muggle_test.py alex alex3714
登陆成功
你可以使用计算器了
6. 前5个模块总结
6.1 collections
'''
#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)
'''
##使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict
'''
from collections import defaultdict
dd = defaultdict(lambda: 'N/A')
dd['key1'] = 'abc'
dd['key1'] # key1存在
dd['key2'] # key2不存在,返回默认值
print(dd['key1'])
print(dd['key2'])
'''
6.2 time
#=====================================time模块=========================================================
##表示时间的三种方式
#(1)时间戳(timestamp)通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。
# 我们运行“type(time.time())”,返回的是float类型。
'''import time
print(time.time())'''''
#(2)格式化的时间字符串(Format String): ‘1999-12-06’
'''
%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 当前时区的名称
%% %号本身'''
#(3) 元组 结构化(struct_time) :struct_time元组共有9个元素共九个元素:
# (年,月,日,时,分,秒,一年中第几周,一年中第几天等)
'''
索引(Index) 属性(Attribute) 值(Values)
0 tm_year(年) 比如2011
1 tm_mon(月) 1 - 12
2 tm_mday(日) 1 - 31
3 tm_hour(时) 0 - 23
4 tm_min(分) 0 - 59
5 tm_sec(秒) 0 - 60
6 tm_wday(weekday) 0 - 6(0表示周一)
7 tm_yday(一年中的第几天) 1 - 366
8 tm_isdst(是否是夏令时) 默认为0
'''
#例如
'''
import time #导入时间模块
#=====时间戳======
#print(time.time())
#=====时间字符串=====格式化时间==
#print(time.strftime('%Y-%m-%d')) # 时间字符串年月日
#print(time.strftime('%Y-%m-%d %H:%M:%S')) # 时间字符串年月日时分秒
#=====时间元祖====结构化时间==
t = time.localtime()
print(t)
'''
#================================================================================================================
######几种格式之间的转换######
'''1.时间戳 -->结构化时间
#timestamp(时间戳)-----struct_time(结构化时间) 用localtime或者gmtime
#time.gmtime(时间戳) #UTC时间,与英国伦敦当地时间一致
#time.localtime(时间戳) #当地时间。例如我们现在在北京执行这个方法:与UTC时间相差8小时,UTC时间+8小时 = 北京时间
'''
#例子
'''
import time
t = time.gmtime(1500000000)
t1 = time.localtime(1500000000)
'''
#=============================================================================================
'''2.结构化时间-->时间戳
#time.mktime(结构化时间)
# struct_time(结构化时间)-----timestamp(时间戳) 用mktime
'''
#例子
'''
import time
time_tuple = time.localtime(1500000000)
print(time.mktime(time_tuple))
'''
#===========================================================================================
'''3.结构化时间-----字符串时间 用strftime
#time.strftime("格式定义","结构化时间") 结构化时间参数若不传,则现实当前时间'''
#例子
'''
import time
time.strftime("%Y-%m-%d %X")#参数若不传,则现实当前时间'2018-01-10 17:09:46'
time.strftime("%Y-%m-%d",time.localtime(1500000000))
'''
#==========================================================================================
'''4.字符串时间-->结构化时间
time.strptime (时间字符串,字符串对应格式)'''
#例子
'''
import time
time.strptime("2017-03-16","%Y-%m-%d")
time.strptime("07/24/2017","%m/%d/%Y")
'''
#======================转串串=========================
#结构化时间 --> %a %b %d %H:%M:%S %Y串
#time.asctime(结构化时间) 如果不传参数,直接返回当前时间的格式化串
import time
time.asctime(time.localtime(1500000000))
'Fri Jul 14 10:40:00 2017'
time.asctime()
'Mon Jul 24 15:18:33 2017'
#%a %d %d %H:%M:%S %Y串 --> 结构化时间
#time.ctime(时间戳) 如果不传参数,直接返回当前时间的格式化串
time.ctime()
'Mon Jul 24 15:19:07 2017'
time.ctime(1500000000)
'Fri Jul 14 10:40:00 2017'
6.3 random
# ===========================random模块===========================
import random
#随机小数
random.random() #大于0且小于1的小数
random.uniform(1,3) #大于1小于3的小数
#随机整数
random.randint(1,5) # 大于等于1且小于等于5之间的整数,只输出一个随机输出
random.randrange(1,10,2) # 大于等于1且小于10之间的奇数,只输出一个随机输出
#随机选择一个返回
random.choice([[1,2,3,9,[3,4]]]) #1或者2或者3或者9或者[3,4]
random.choices([1,2,3,9,[3,4]]) #[1]或者[2]或者[3]或者[9]或者[[3,4]]
#随机选择多个返回,返回的个数为函数的第二个参数
random.sample([1, '23', [4,5]], 2) # #列表元素任意2个组合
#[]是一个元素,2是选择[]里的个数
#打乱列表顺序 shuffle
item=[1,3,5,7,9]
random.shuffle(item)
print(item)
6.4 os
#=========================================os模块===========================================
'''
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.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).read() 运行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') 获取文件/目录信息
'''''
# 注意:
# os.stat('path/filename') 获取文件/目录信息 的结构说明
'''stat 结构:
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)是创建时间(详细信息参见平台的文档)。'''
6.5 sys
#====================sys模块========================================
'''
sys.argv 命令行参数List,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1)
sys.version 获取Python解释程序的版本信息
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称'''''
import sys
try:
sys.exit(1)
except SystemExit as e:
print(e)
6. 序列化模块
什么叫序列化——将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化。
序列化 —— 转向一个字符串数据类型
序列 —— 字符串
从数据类型 --> 字符串的过程 序列化
从字符串 --> 数据类型的过程 反序列化
6.1 三个序列化模块介绍
json *****
pickle ****
shelve ***
json # 数字 字符串 列表 字典 元组
通用的序列化格式
只有很少的一部分数据类型能够通过json转化成字符串
pickle
所有的python中的数据类型都可以转化成字符串形式
pickle序列化的内容只有python能理解
且部分反序列化依赖python代码
shelve
序列化句柄
使用句柄直接操作,非常方便
6.2 json
dumps:序列化方法
loads:反序列化方法
范例1:dumps 与 loads(内存方式)
import json
dic = {"k1":"v1"}
print(type(dic),dic)
str_d = json.dumps(dic) # 序列化
print(type(str_d),str_d)
dic_d = json.loads(str_d) # 反序列化
print(type(dic_d),dic_d)
执行结果:
<class 'dict'> {'k1': 'v1'}
<class 'str'> {"k1": "v1"}
<class 'dict'> {'k1': 'v1'}
范例2:元组的序列化与反序列化
import json
dic = (1,2,3,4)
print(type(dic),dic)
str_d = json.dumps(dic) # 序列化
print(type(str_d),str_d)
dic_d = json.loads(str_d) # 反序列化
print(type(dic_d),dic_d)
执行结果:
<class 'tuple'> (1, 2, 3, 4)
<class 'str'> [1, 2, 3, 4]
<class 'list'> [1, 2, 3, 4]
范例3.1:dump与load(英文)
dump
import json
dic = {1:"a",2:'b'}
f = open('fff','w',encoding='utf-8')
json.dump(dic,f)
f.close()
执行结果:
# 文件fff中的内容
{"1": "a", "2": "b"}
load
import json
f = open('fff')
res = json.load(f)
f.close()
print(type(res),res)
执行结果:
<class 'dict'> {'1': 'a', '2': 'b'}
范例3.2:dump与load(中文)
import json
dic = {1:"中国",2:'b'}
f = open('fff','w',encoding='utf-8')
json.dump(dic,f,ensure_ascii=False)
f.close()
f = open('fff',encoding="utf-8")
res = json.load(f)
f.close()
print(type(res),res)
执行结果:
# 文件fff中的内容
{"1": "中国", "2": "b"}
<class 'dict'> {'1': '中国', '2': 'b'}
范例3.3:分次写数据
import json
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()
执行结果:
# 文件file中的内容
{"k": "111"}
{"k2": "111"}
{"k3": "111"}
f = open('file')
import json
l = []
for line in f:
dic = json.loads(line.strip())
l.append(dic)
f.close()
print(l)
执行结果:
[{'k': '111'}, {'k2': '111'}, {'k3': '111'}]
6.3 pickle
范例1:
import pickle
dic = {'k1':'v1','k2':'v2','k3':'v3'}
str_dic = pickle.dumps(dic)
print(str_dic) #一串二进制内容
dic2 = pickle.loads(str_dic)
print(dic2) #字典
执行结果:
b'\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01X\x02\x00\x00\x00v1q\x02X\x02\x00\x00\x00k2q\x03X\x02\x00\x00\x00v2q\x04X\x02\x00\x00\x00k3q\x05X\x02\x00\x00\x00v3q\x06u.'
{'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
范例2.1:
import pickle
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)
f.close()
执行结果:
time.struct_time(tm_year=2001, tm_mon=9, tm_mday=9, tm_hour=9, tm_min=46, tm_sec=40, tm_wday=6, tm_yday=252, tm_isdst=0)
2001
范例2.2:分批读
import pickle
import time
struct_time1 = time.localtime(1000000000)
struct_time2 = time.localtime(2000000000)
f = open('pickle_file','wb')
pickle.dump(struct_time1,f)
pickle.dump(struct_time2,f)
f.close()
f = open('pickle_file','rb')
struct_time1 = pickle.load(f)
struct_time2 = pickle.load(f)
print(struct_time1.tm_year)
print(struct_time2.tm_year)
f.close()
执行结果:
2001
2033
6.4 shelve
shelve只提供给我们一个open方法,是用key来访问的,使用起来和字典类似
范例1:
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)
执行结果:
{'int': 10, 'float': 9.5, 'string': 'Sample data'}