15_Python常用模块一_全栈开发学习笔记

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())

执行结果:


[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(, {'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              .
2019/01/29  23:01              ..
2019/01/29  22:52              .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              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              .
2019/01/29  23:06              ..
2019/01/29  23:01              .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              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)

执行结果:

 {'k1': 'v1'}
 {"k1": "v1"}
 {'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)

执行结果:

 (1, 2, 3, 4)
 [1, 2, 3, 4]
 [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)

执行结果:

 {'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"}
 {'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'}

你可能感兴趣的:(15_Python常用模块一_全栈开发学习笔记)