python模块

序列化模块-pickle

序列化:把不能够直接存储的数据变得可存储

反序列化:把数据恢复成原本的数据格式

dumps 把任意对象序列化成一个bytes
loads 把任意bytes反序列化成原来数据
>>> import pickle
>>> listvar = [1,2,3]
>>> res = pickle.dumps(listvar)
>>> res
b'\x80\x03]q\x00(K\x01K\x02K\x03e.'
>>>
>>> res = pickle.loads(res)
>>> print(res,type(res))
[1, 2, 3] <class 'list'>
>>>
序列化函数
>>> import pickle
>>> def func():
...   print('func')
...
>>> res = pickle.dumps(func)
>>> print(res)
b'\x80\x03c__main__\nfunc\nq\x00.'
>>>
>>> func = pickle.loads(res)
>>> func()
func
>>>

  序列化迭代器

>>> import pickle
>>> from collections import Iterator,Iterable
>>> it = iter(range(5))
>>> print(isinstance(it,Iterator))
True
>>> res = pickle.dumps(it)
>>> print(res)
b'\x80\x03cbuiltins\niter\nq\x00cbuiltins\nrange\nq\x01K\x00K\x05K\x01\x87q\x02Rq\x03\x85q\x04Rq\x05K\x00b.'
>>> res = pickle.loads(res)
>>> print(res)
<range_iterator object at 0x0000023C8BE57F90>
>>> for i in res:
...   print(i)
...
0
1
2
3
4
>>>
dump  把对象序列化后写入到file-like Object(即文件对象)
def func2():
	print("我是func2")

with open("test.txt",mode="wb") as fp:
	# 参数1:要序列化的数据 参数2:对应的文件对象
	pickle.dump(func2,fp)
load  把file-like Object(即文件对象)中的内容拿出来,反序列化成原来数据
with open("test.txt",mode="rb") as fp:
	func = pickle.load(fp)

# 调用函数
func()

数学模块-math

使用方法:模块.方法()

ceil()  向上取整操作 (对比内置round)
>>> import math
>>> print(math.ceil(3.01))
4
>>> print(math.ceil(3.9))
4
>>> print(math.ceil(3.000000000000000000000001))
3
>>>
floor() 向下取整操作 (对比内置round)
>>> import math
>>> print(math.floor(3.99))
3
>>> print(math.floor(3.001))
3
>>>
pow()  计算一个数值的N次方(结果为浮点数) (对比内置pow)
>>> print(math.pow(2,3)) # 对比内置pow,没有第三个参数
8.0
>>>
sqrt() 开平方运算(结果浮点数)
>>> import math
>>> print(math.sqrt(9))
3.0
>>>
fabs() 计算一个数值的绝对值 (结果浮点数) (对比内置abs)
>>> import math
>>> print(math.fabs(-8))
8.0
>>>
modf() 将一个数值拆分为整数和小数两部分组成元组
>>> import math
>>> print(math.modf(5.12))
(0.1200000000000001, 5.0)
>>>
copysign()  将参数第二个数值的正负号拷贝给第一个
>>> import math
>>> print(math.copysign(5,-9))
-5.0
>>> print(math.copysign(-5,-9))
-5.0
>>>
fsum() 将一个容器数据中的数据进行求和运算 (结果浮点数)(对比内置sum)
>>> import math
>>> listvar = [1,2,3,4,5]
>>> print(math.fsum(listvar))
15.0
>>>
圆周率常数 pi
>>> import math
>>> print(math.pi)
3.141592653589793
>>>

随机模块-random

random() 获取随机0-1之间的小数(左闭右开)
>>> import random
>>> res = random.random()
>>> res
0.47163878946605897
>>>
randrange() 随机获取指定范围内的整数(包含开始值,不包含结束值,间隔值)
>>> import random
>>> print(random.randrange(3))
2
>>>
randint()   随机产生指定范围内的随机整数 必须两个参数
>>> import random
>>> print(random.randint(1,4))
1
>>>
uniform() 获取指定范围内的随机小数(左闭右开)
>>> import random
>>> print(random.uniform(1,3))
1.9395628932781275
>>>
choice()  随机获取序列中的值(多选一)
>>> import random
>>> listvar = [1,2,3,4,5]
>>> print(random.choice(listvar))
3
>>> # 自定义choice
...
>>> def mychoice():
...   length = len(listvar)
...   res = random.randrange(0,length)
...   return listvar[res]
...
>>> mychoice()
2
>>>
sample()  随机获取序列中的值(多选多) [返回列表]
>>> import random
>>> listvar = [1,2,3,4,5]
>>> listvar = random.sample(listvar,3)
>>> print(listvar)
[3, 2, 5]
>>>
shuffle() 随机打乱序列中的值(直接打乱原序列)
>>> import random
>>> listvar = [1,2,3,4,5]
>>> random.shuffle(listvar)
>>> print(listvar)
[3, 1, 4, 2, 5]
>>>

  应用:随机验证码

# 随机验证码 
def yanzhengma():
	strvar = ""
	for i in range(4):
		# a~z  97 ~ 122 获取小写字母
		res1 = chr(random.randrange(97,123))
		# A~Z  65 ~ 90  获取大写字母
		res2 = chr(random.randrange(65,91))
		# 0~9  获取0~9 十个数字  
		res3 = random.randrange(0,10)
		# 把可能的字符放到列表当中
		lst = [res1,res2,res3]
		# 拼接字符串
		strvar += str(random.choice(lst))
	# 返回字符串
	return strvar
		

res= yanzhengma()
print(res)

时间模块-time

time()      获取本地时间戳
>>> import time
>>> print(time.time())
1564221298.0812767
>>>
mktime()        通过[时间元组]获取[时间戳] (参数是时间元组)
>>> import time
>>> timevar = (2019,7,27,17,55,0,0,0,0)
>>> print(time.mktime(timevar))
1564221300.0
>>>
localtime()     通过[时间戳]获取[时间元组] (默认当前时间)
>>> import time
>>> print(time.localtime())
time.struct_time(tm_year=2019, tm_mon=7, tm_mday=27, tm_hour=17, tm_min=56, tm_sec=58, tm_wday=5, tm_yday=208, tm_isdst=0)
>>> print(time.localtime(1564221300.0))
time.struct_time(tm_year=2019, tm_mon=7, tm_mday=27, tm_hour=17, tm_min=55, tm_sec=0, tm_wday=5, tm_yday=208, tm_isdst=0)
>>>
ctime()         通过[时间戳]获取[时间字符串] (默认当前时间)
>>> import time
>>> print(time.ctime())
Sat Jul 27 17:58:08 2019
>>> print(time.ctime(1564221300.0))
Sat Jul 27 17:55:00 2019
>>>
asctime()       通过[时间元组]获取[时间字符串](参数是时间元组)
>>> timevar = (2019,7,27,17,55,0,0,0,0)
>>> print(time.asctime(timevar))
Mon Jul 27 17:55:00 2019
>>>
>>> timevar = (2019,7,27,17,55,0,0,0,0)
>>> res = time.mktime(timevar)
>>> starttime = time.ctime(res)
>>> print(starttime)
Sat Jul 27 17:55:00 2019
>>>
strftime()      通过[时间元组]格式化[时间字符串]  (格式化字符串,[可选时间元组参数])
>>> import time
>>> res = time.strftime("%Y-%m-%d %H:%M:%S")
>>> print(res)
2019-07-27 18:02:34
>>> timevar =(2019,7,27,17,55,0,0,0,0)
>>> res = time.strftime("%Y-%m-%d %H:%M:%S",timevar)
>>> print(res)
2019-07-27 17:55:00
>>>
strptime()      通过[时间字符串]提取出[时间元组]  (时间字符串,格式化字符串)
两个字符串之间除了格式化标签外,其它必须一模一样
>>> import time
>>> strvara = "2019年7月27日18点55分30秒"
>>> strvarb = "%Y年%m月%d日%H点%M分%S秒"
>>> res = time.strptime(strvara,strvarb)
>>> print(res)
time.struct_time(tm_year=2019, tm_mon=7, tm_mday=27, tm_hour=18, tm_min=55, tm_sec=30, tm_wday=5, tm_yday=208, tm_isdst=-1)
>>>
sleep()         程序睡眠等待
>>> def func():
...   starttime = time.time()
...   time.sleep(3)
...   endtime = time.time()
...   print(endtime - starttime)
...
>>> func()
3.0033180713653564
>>>
perf_counter()  用于计算程序运行的时间
>>> import time
>>> starttime = time.perf_counter()
>>> for i in range(1000000):
...   pass
...
>>> endtime = time.perf_counter()
>>> res = endtime - starttime
>>> print(res)
29.673176886111193
>>>

时间模块相关知识

时间戳指从1970年1月1日0时0分0秒到指定时间之间的秒数,时间戳是秒,可以使用到2038年的某一天
UTC时间: 世界约定的时间表示方式,世界统一时间格式,世界协调时间!
夏令时: 在夏令时时间状态下,时间会调块1个小时

时间元组是使用元祖格式表示时间的一种方式
  格式1(自定义):
      (年,月,日,时,分,秒,周几,一年中的第几天,是否是夏令时时间)
  格式2(系统提供):
      (tm_year = 年,tm_month = 月,tm_day = 日,tm _hour = 时, tm_min = 分, tm _sec = 秒, tm _wday = 周几, tm _yday = 一年中的第几天,tm_isdst = 是否是夏令时时间)

      0   年   4位数完整年份   四位数1997
      1   月   1-12月           1 - 12
      2   日   1-31天           1 - 31
      3   时   0-23时           0 - 23
      4   分   0-59分           0 - 59
      5   秒   0-61秒           0 - 61
      6   周几 周一-周天         0 - 6
      7   年中第几天   共366天 1 - 366
      8   夏令时 两种           0,1 0是 其他都不是  

格式化时间字符串:
  格式   含义        
  %a   本地(locale)简化星期名称
  %A   本地完整星期名称
  %b   本地简化月份名称
  %B   本地完整月份名称
  %c   本地相应的日期和时间表示
  %d   一个月中的第几天(01 - 31)
  %H   一天中的第几个小时(24 小时制,00 - 23)
  %I   一天中的第几个小时(12 小时制,01 - 12)
  %j   一年中的第几天(001 - 366)
  %m   月份(01 - 12)
  %M   分钟数(00 - 59)
  %p   本地 am 或者 pm 的相应符    
  %S   秒(01 - 61)  
  %U   一年中的星期数(00 - 53 星期天是一个星期的开始)第一个星期天之前的所有天数都放在第 0 周    
  %w   一个星期中的第几天(0 - 6,0 是星期天)  
  %W   和 %U 基本相同,不同的是 %W 以星期一为一个星期的开始
  %X   本地相应时间
  %y   去掉世纪的年份(00 - 99)
  %Y   完整的年份
  %z   用 +HHMM 或 -HHMM 表示距离格林威治的时区偏移(H 代表十进制的小时数,M 代表十进制的分钟数)
  %%   %号本身
   
--不常用的属性函数(了解)
  *gmtime()       获取UTC时间元祖(世界标准时间)
  *time.timezone   获取当前时区(时区的时间差)
  *time.altzone   获取当前时区(夏令时)
  *time.daylight   获取夏令时状态

日历模块-calendar(了解内容)

--calendar 日历模块 import calendar
calendar() 获取指定年份的日历字符串 (年份,w日期间的宽度,l日期间的高度,c月份间的间距,m一行显示几个月)
calendar.calendar(2018,w=2,l=2,c=20,m=1)

month() 获取指定年月的日历字符串 (年份,月份,w日期之间的宽度,l日期之间的高度)
calendar.month(2018,9,w = 2,l = 2)

monthcalendar() 获取指定年月的信息列表 (年份,月份) 0从周一开始排
calendar.monthcalendar(2018,9)

isleap() 检测是否是润年(能被4整除不能被100整除或能被400整除)
calendar.isleap(2004)

leapdays() 指定从某年到某年范围内的润年个数
calendar.leapdays(1970,2038)

monthrange() 获取某年某月的信息 周一是0
calendar.monthrange(2018,8)

weekday() 指定某年某月某日是星期几
calendar.weekday(2018,8,18)

timegm() 将时间元组转化为时间戳
ttp = (2018,10,1,13,23,34,0,0,0)
calendar.timegm(ttp)

os模块-对系统进行操作

system()  在python中执行系统命令
>>> import os
>>> print(os.system("ipconfig"))
popen()   执行系统命令返回对象,通过read方法读出字符串
>>> import os
>>> obj = os.popen("ipconfig")
>>> obj
<os._wrap_close object at 0x0000023C8DD2F940>
>>> print(obj.read())
listdir() 获取指定文件夹中所有内容的名称列表
>>> import os
>>> res = os.listdir(".")
>>> print(res)
getcwd()  获取当前文件所在的默认路径
>>> import os
>>> res = os.getcwd()
>>> print(res)
mkdir 创建目录
os.mkdir('test')
rmdir 删除目录
os.rmdir('test')
rename 目录重命名
os.rename('testa','testb')
copy 复制文件权限和内容
chdir()   修改当前文件工作的默认路径
environ   获取或修改环境变量
--os 模块属性
name 获取系统标识   linux,mac ->posix     windows -> nt
sep 获取路径分割符号 linux,mac -> /       window-> \
linesep 获取系统的换行符号 linux,mac -> \n   window->\r\n 或 \n
>>> print(os.name)
nt
>>> print(os.sep)
\
>>> print(repr(os.linesep))
'\r\n'
>>>

os路径模块 -os.path

abspath()  将相对路径转化为绝对路径
>>> print(os.path.abspath("."))
C:\Users\lenovo
>>>
basename() 返回文件名部分
>>> pathvar = r"c:\user\lenovo\test.txt"
>>> print(os.path.basename(pathvar))
test.txt
>>>
dirname()  返回路径部分
>>> pathvar = r"c:\user\lenovo\test.txt"
>>> print(os.path.dirname(pathvar))
c:\user\lenovo
>>>
split() 将路径拆分成单独的文件部分和路径部分 组合成一个元组
>>> pathvar = r"c:\user\lenovo\test.txt"
>>> print(os.path.split(pathvar))
('c:\\user\\lenovo', 'test.txt')
>>>
join()  将多个路径和文件组成新的路径 可以自动通过不同的系统加不同的斜杠  linux / windows\
>>> patha = "lesson"
>>> pathb = "filename.py"
>>> print(os.path.join(patha,pathb))
lesson\filename.py
>>>
splitext() 将路径分割为后缀和其他部分
>>> pathvar = r"c:\user\lenovo\test.txt"
>>> print(os.path.splitext(pathvar))
('c:\\user\\lenovo\\test', '.txt')
>>>
getsize()  获取文件的大小
>>> pathvar = r"E:\python-lesson\python\L006\5.os.path.py"
>>> print(os.path.getsize(pathvar))
2962
>>>
isdir()    检测路径是否是一个文件夹
>>> pathvar = r"E:\python-lesson\python\L006"
>>> print(os.path.isdir(pathvar))
True
>>>
isfile()   检测路径是否是一个文件
>>> pathvar = r"E:\python-lesson\python\L006\5.os.path.py"
>>> print(os.path.isfile(pathvar))
True
>>>
islink()   检测路径是否是一个链接
getctime() [windows]文件的创建时间,[linux]权限的改动时间(返回时间戳)
getmtime() 获取文件最后一次修改时间(返回时间戳)
getatime() 获取文件最后一次访问时间(返回时间戳)
>>> pathvar = r"E:\python-lesson\python\L006\5.os.path.py"
>>> print(os.path.getctime(pathvar))
1564310636.182642
>>> import time
>>> stime = time.ctime(os.path.getctime(pathvar))
>>> stime
'Sun Jul 28 18:43:56 2019'
>>> print(time.ctime(os.path.getmtime(pathvar)))
Sun Jul 28 12:18:28 2019
>>> print(time.ctime(os.path.getatime(pathvar)))
Tue Aug  6 21:17:26 2019
>>>
exists()   检测指定的路径是否存在
isabs()   检测一个路径是否是绝对路径
>>> pathvar = r"E:\python-lesson\python\L006\5.os.path.py"
>>> print(os.path.exists(pathvar))
True
>>> print(os.path.isabs(pathvar))
True
>>>

os 与 shutil 模块 都具备对文件的操作

 -- os模块具有 新建/删除/
os.mknod   创建文件
os.remove 删除文件
os.mkdir   创建目录(文件夹)
os.rmdir   删除目录(文件夹)
os.rename 对文件,目录重命名
os.makedirs   递归创建文件夹
os.removedirs 递归删除文件夹(空文件夹)

shutil模块

 -- shutil模块 复制/移动/
copyfileobj(fsrc, fdst[, length=16*1024]) 复制文件 (length的单位是字符(表达一次读多少字符))
copyfile(src,dst)   #单纯的仅复制文件内容 , 底层调用了 copyfileobj
copymode(src,dst)   #单纯的仅复制文件权限 , 不包括内容 (虚拟机共享目录都是默认777)
copystat(src,dst)   #复制所有状态信息,包括权限,组,用户,修改时间等,不包括内容
copy(src,dst)       #复制文件权限和内容
copy2(src,dst)     #复制文件权限和内容,还包括权限,组,用户,时间等
copytree(src,dst)   #拷贝文件夹里所有内容(递归拷贝)
rmtree(path)       #删除当前文件夹及其中所有内容(递归删除)
move(path1,paht2)   #移动文件或者文件夹

json模块

 所有编程语言都能够识别的数据格式叫做json,是字符串
dumps 把任意对象序列化成一个str
loads 把任意str反序列化成原来数据
1.序列化时的参数 ensure_ascii=True 是否显示中文;sort_keys=True 对字典的健按ascii排序
>>> import json
>>> dictvar = {"b":2,"a":1,"c":3}
>>> res = json.dumps(dictvar,ensure_ascii=False,sort_keys=True)
>>> print(res,type(res))
{"a": 1, "b": 2, "c": 3} <class 'str'>
>>> print(repr(res))
'{"a": 1, "b": 2, "c": 3}'
>>> dictvar = json.loads(res)
>>> print(dictvar,type(dictvar))
{'a': 1, 'b': 2, 'c': 3} <class 'dict'>
>>>
dump  把对象序列化后写入到file-like Object(即文件对象)
load 把file-like Object(即文件对象)中的内容拿出来,反序列化成原来数据
1.json可以连续dump,但不能连续load,可以用loads解决
dic1 = {'a':1,"b":2}
dic2 = {"c":3,"d":4}

with open("test.json",mode="w",encoding="utf-8") as fp:
	json.dump(dic1,fp)
	fp.write("\n")
	json.dump(dic2,fp)
	fp.write("\n")

  解决方式

with open("test.json",mode="r",encoding="utf-8") as fp:
	for line in fp:
		res = json.loads(line)
		print(res)

json 和 pickle 两个模块的区别:
(1)json序列化之后的数据类型是str,所有编程语言都识别,
  但是仅限于(int float bool)(str list tuple dict None)
  json不能连续load,只能一次性拿出所有数据
(2)pickle序列化之后的数据类型是bytes,
  所有数据类型都可转化,但仅限于python之间的存储传输.
  pickle可以连续load,多套数据放到同一个文件中

压缩模块-zipfile (后缀为zip)

zipfile.ZipFile(file[, mode[, compression[, allowZip64]]])
ZipFile(路径包名,模式,压缩or打包,可选allowZip64)
功能:创建一个ZipFile对象,表示一个zip文件.
参数:
  -参数file表示文件的路径或类文件对象(file-like object)
  -参数mode指示打开zip文件的模式,默认值为r
      r   表示读取已经存在的zip文件
      w   表示新建一个zip文档或覆盖一个已经存在的zip文档
      a   表示将数据追加到一个现存的zip文档中。
  -参数compression表示在写zip文档时使用的压缩方法
      zipfile.ZIP_STORED     只是存储模式,不会对文件进行压缩,这个是默认值
      zipfile.ZIP_DEFLATED   对文件进行压缩
  -如果要操作的zip文件大小超过2G,应该将allowZip64设置为True。

压缩文件
1.ZipFile()         写模式w打开或者新建压缩文件
2.write(路径,别名)   向压缩文件中添加文件内容
3.close()           关闭压缩文件

解压文件
1.ZipFile()             读模式r打开压缩文件
2.extractall(路径)     解压所有文件到某个路径下
extract(文件,路径)   解压指定的某个文件到某个路径下
3.close()               关闭压缩文件

追加文件(支持with写法)
ZipFile()               追加模式a打开压缩文件

查看压缩包中的内容
namelist()

压缩模块-tarfile(后缀为.tar | .tar.gz | .tar.bz2) (了解)

bz2模式的压缩文件较小  根据电脑的不同会差生不同的结果 (理论上:bz2压缩之后更小,按实际情况为标准)

w     单纯的套一个后缀 打包
w:bz2 采用bz2算法 压缩    
w:gz 采用gz算法 压缩

压缩文件
1.open('路径包名','模式','字符编码') 创建或者打开文件
2.add(路径文件,arcname="别名") 向压缩文件中添加文件
3,close() 关闭文件

解压文件
1.open('路径包名','模式','字符编码') 读模式打开文件
2.extractall(路径)     解压所有文件到某个路径下
extract(文件,路径)   解压指定的某个文件到某个路径下
3.close()               关闭压缩文件

追加文件
open()                   追加模式 a: 打开压缩文件 正常添加即可

查看压缩包中的内容
getnames()    

计算一个文件夹所有文件的大小

# ### 计算一个文件夹所有文件的大小
import os
path1 = os.getcwd()
# print(path1)
pathvar = os.path.join(path1,"test")
# D:\L006\test
print(pathvar)



# part1 基本操作
lst = os.listdir(pathvar)
print(lst)

# 初始化变量size =  0 
size = 0
for i in lst:    

    # 拼接成完整的绝对路径
    pathnew = os.path.join(pathvar,i)
    # 判定它是不是文件
    if os.path.isfile(pathnew):
        print(i,"是一个[文件]")
        # 如果是文件,计算大小 getsize 只能算文件的大小
        size += os.path.getsize(pathnew)
    # 判定它是不是文件夹
    elif os.path.isdir(pathnew):
        print(i,"是一个[文件夹]")
print(size)  # 4834


# part2 递归方法计算文件夹里所有内容大小
def getallsize(pathvar):

    size = 0
    lst = os.listdir(pathvar)
    
    for i in lst:
        pathnew = os.path.join(pathvar,i)
        if os.path.isfile(pathnew):
            print(pathnew)
            # 统计文件大小
            size += os.path.getsize(pathnew)
        elif os.path.isdir(pathnew):    
            print(pathnew) # D:\L006\test\testa
            # 递归统计文件夹里面的文件名称
            size += getallsize(pathnew)
            
    return size
res = getallsize(pathvar)
print(res) # 6882 + 953 2048 4834
View Code

 

posted @ 2019-07-27 17:39  wangzihong  阅读(249)  评论(0编辑  收藏  举报