11Python标准模块

Posted 中国先疯队队长

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了11Python标准模块相关的知识,希望对你有一定的参考价值。

一、time模块

    在python中,时间的表示有三种方式:时间戳表示,元组的表示和格式化表示,先来看一下这三种时间表示方法在python中的语法。

1、时间戳表示法:

import  time
print(time.time()) #时间戳表示 执行结果1517984732.4657302

     要想获得系统的时间戳直接调用time模块的time函数就好了,那么这一坨1517984732.4657302是个什么玩意呢?不要方,我们来换算一下,我们将这个值换算成年也就是:1517984732.4657302/(60*60*24*365)约等于48年,用2018-1970=48。实际上,时间戳就是用当前时间减去1970然后再把这个单位换算成秒得来的。

2、元组表示法:

1 import  time
2 print(time.gmtime(),time.localtime())#gmtime()为UTC时间,localtime()为本地时间
3 time_01 = time.localtime()
4 print(time_01.tm_year,time_01.tm_mon,time_01.tm_mday) #取出年月日

      这2个方法都需要传递一个时间戳的参数,如果未传默认用系统的时间戳,返回的是一个元组,time.struct_time(tm_year=2018, tm_mon=2, tm_mday=7, tm_hour=14, tm_min=45, tm_sec=26, tm_wday=2, tm_yday=38, tm_isdst=0)。

3、格式化表示法:

    很多时候我们希望时间能够展示成我们自己想要定义的格式,这时候就要用到格式化的表示方式。

1 import  time
2 print(time.strftime("%Y-%m-%d %H:%M:%S")) #默认格式化系统当前时间 2018-02-07 14:57:50
3 print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(45454545))) #传入了一个tuple时间进行格式化 1971-06-11 10:15:45

    学习了这三种时间的表示方法,我们用一个图来描述这三种表示法之间的相互转换。

二、datetime模块(待补充)

1 import  datetime
2 print(datetime.datetime.now()) #系统当前日期
3 print(datetime.datetime.now()+datetime.timedelta(3,hours=10)) #后三天,10小时的时间

三、random模块

    random模块用法如下:

 1 import random
 2 print(random.random()) #在区间[0,1)之间随机取值
 3 help(random.choices) #help函数可以查看具体函数、模块等用法
 4 print(random.randint(1,3)) #在区间[1,3]之间随机取整数
 5 print(random.randrange(1,10,2)) #在区间[1,10,2)之间取随机整数
 6 print(random.choice("123456azsxdsq"),random.choice([1,2,3,4,5])) #从字符串或列表中随机抽取元素
 7 print(random.uniform(1,2))#在区间[1,2)之间的随机小数
 8 print(random.choices("12ddsds",k=2)) #从字符串中随机返回2个字符
 9 x = [1,2,3,4,5,6,7,8]
10 random.shuffle(x)#打乱顺序

利用random模块生成验证码:

 1 def gernateVerCodeEx(size=4):
 2     code = \'\'
 3     for i in range(size):
 4         current = random.randint(0,size-1)
 5         if i == current:
 6             code += str(random.randint(0,9))
 7         elif random.randint(0,size)%2 == 0:
 8             code += chr(random.randint(65,90))
 9         else:
10             code += chr(random.randint(97,121))
11     return code
12 print(gernateVerCodeEx(4))

四、OS模块

提供对操作系统进行调用的接口

 1 import os
 2 os.getcwd() #获取当前工作目录,即当前python脚本工作的目录路径
 3 os.chdir("F:/")  #改变当前脚本工作目录;相当于shell下cd
 4 os.curdir  #返回当前目录: (\'.\')
 5 os.pardir  #获取当前目录的父目录字符串名:(\'..\')
 6 os.makedirs(\'F:/a/b/c\')    #可生成多层递归目录
 7 os.removedirs(\'test/a\')    #若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
 8 os.mkdir(\'dirname\')    #生成单级目录;相当于shell中mkdir dirname
 9 os.rmdir(\'dirname\')    #删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
10 print(os.listdir("F:/python_learn"))    #列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
11 os.mkdir("test/a")
12 os.remove("test/a/11")  #删除一个文件
13 os.rename("OS_learn.py","os_learn.py")  #重命名文件/目录
14 os.stat(\'os_learn.py\')  #获取文件/目录信息
15 os.sep    #输出操作系统特定的路径分隔符,win下为"\\\\",Linux下为"/"
16 os.linesep    #输出当前平台使用的行终止符,win下为"\\t\\n",Linux下为"\\n"
17 os.pathsep    #输出用于分割文件路径的字符串
18 os.name    #输出字符串指示当前使用平台。win->\'nt\'; Linux->\'posix\'
19 os.system("ipconfig")  #运行shell命令,直接显示
20 os.environ #获取系统环境变量
21 os.path.abspath("F:/python_learn")  #返回path规范化的绝对路径
22 os.path.split("a/c/c")  #将path分割成目录和文件名二元组返回
23 os.path.dirname("F:/python_learn")  #返回path的目录。其实就是os.path.split(path)的第一个元素
24 os.path.basename("F:/python_learn")  #返回path最后的文件名。如何path以/或\\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
25 os.path.exists("F:/python_learn") #如果path存在,返回True;如果path不存在,返回False
26 os.path.isabs("/s")  #如果path是绝对路径,返回True
27 os.path.isfile("F:/python_learn") #  如果path是一个存在的文件,返回True。否则返回False
28 os.path.isdir("F:/python_learn")  #如果path是一个存在的目录,则返回True。否则返回False
29 os.path.join("F:\\\\","a","\\\\b") #  #将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
30 os.path.getatime("F:/python_learn") #返回path所指向的文件或者目录的最后存取时间
31 os.path.getmtime("F:/python_learn")  #返回path所指向的文件或者目录的最后修改时间

五、sys模块

 1 # -*- coding:utf-8 -*-
 2 import sys
 3 sys.argv           #命令行参数List,第一个元素是程序本身路径
 4 sys.exit(0)        #退出程序,正常退出时exit(0)
 5 sys.version        #获取Python解释程序的版本信息
 6 sys.maxsize         #最大的Int值
 7 sys.path          #返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
 8 sys.platform       #返回操作系统平台名称
 9 sys.stdout.write(\'please:\')
10 val = sys.stdin.readline()[:-1]
11 print(val)

六、shutil模块

   高级的 文件、文件夹、压缩包 处理模块

 1 # -*- coding:utf-8 -*-
 2 import shutil
 3 with open("test_01","r") as fsrc,open("test_02","w") as fdst:
 4     shutil.copyfileobj(fsrc, fdst) #将test_01的文件内容拷贝到test_02中
 5 shutil.copyfile("test_01","test_02") #文件拷贝
 6 shutil.copy("test_01","test_02") #拷贝文件和权限
 7 shutil.copytree("F:/python_learn","F:/a") #递归拷贝
 8 shutil.rmtree("F:/a") #递归删除目录
 9 shutil.move("F:/test.txt","F:/software") #递归移动文件
10 shutil.make_archive("F:/a/python_learn_new", "zip", "F:/python_learn")  # 压缩文件
11 shutil.unpack_archive("F:/a/python_learn_new.zip","F:/a","zip") #解压文件

七、shelve模块

    helve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式。

 1 # -*- coding:utf-8 -*-
 2 import shelve
 3 info = {\'name\':\'高文祥\',\'age\':18}
 4 def getAddress():
 5     return "上海"
 6 contract = {"address":getAddress,"QQ":"258469451","phone":"1585555555555"}
 7 with shelve.open(\'shelve_test\') as f:#打开一个文件
 8     f["info"] = info
 9     f["contract"] = contract #持久化数据
10 with shelve.open(\'shelve_test\') as f:
11     info_01 = f["info"]
12     info_02 = f["contract"] #读取数据
13     print(info_01["name"], info_02["address"]())

 讲到shelve,我们来学习一下2个序列号的方法json和pickle。

json序列化的代码如下:

 1 info = {\'name\':\'高文祥\',\'age\':18}
 2 def getAddress(name):
 3     return "上海"+name
 4 contract = {"address":getAddress,"QQ":"258469451","phone":"1585555555555"}
 5 import  json
 6 with open("json_01.txt","w",encoding="utf-8") as file:
 7     json.dump(info,file) #序列化存入文件  json.dumps(info)只序列化不存入文件
 8     json.dump(contract,file) #执行报错 json无法序列化函数TypeError: Object of type \'function\' is not JSON serializable
 9 
10 with open("json_01.txt","r",encoding="utf-8") as file:
11     info_json = json.load(file)  #反序列化 json.load() 只反序列化 不存入文件
12     print(info_json["name"])

pickle序列化代码如下:

import  pickle
info = {\'name\':\'高文祥\',\'age\':18}
def getAddress(name):
    return "上海"+name
contract = {"address":getAddress,"QQ":"258469451","phone":"1585555555555"}
stuNo = [1,2,3,4,5]
with open("pickle_01.txt","wb") as file:
    pickle.dump(contract,file) #第1次dump
    pickle.dump(info, file)#第2次dump
    pickle.dump(stuNo,file)#第3次dump
with open("pickle_01.txt","rb") as file:
    print(pickle.load(file))#执行结果{\'address\': <function getAddress at 0x0085F5D0>, \'QQ\': \'258469451\', \'phone\': \'1585555555555\'}
    print(pickle.load(file))#执行结果{\'name\': \'高文祥\', \'age\': 18}
    print(pickle.load(file))#执行结果[1, 2, 3, 4, 5]

dumps和loads的使用:

import json,pickle
info = {"name":"Helen","age":18}
json_01 = json.dumps(info)
json_02 = json.loads(json_01)
print(type(json_01),type(json_02))
pickle_01
= pickle.dumps(info) pickle_02 = pickle.loads(pickle_01) print(type(pickle_01),type(pickle_02))

dump/load是将对象序列化(反序列化)到文件中(对象),dumps/loads则是将对象序列化(反序列化)成字符串(对象)

 下面我们对shelve,json和pickle实现文件持久化功能作一个总结:

1、json只能序列化简单的数据类型,不能序列化函数,而shelve和pickle可以

2、shelve主要用将数据进行文件持久化时,非常好用

3、JSON只能处理基本数据类型。pickle能处理所有Python的数据类型。

4、JSON用于各种语言之间的字符转换。pickle用于Python程序对象的持久化或者Python程序间对象网络传输,但不同版本的Python序列化可能还有差异。

5、如果想把一个字符串转换为数据类型可以使用eval函数

八、configparser模块

    用于生成和修改常见配置文档,下面就有configparser来生成一个配置文件,代码如下:

 1 import configparser
 2 config = configparser.ConfigParser()
 3 config["DEFAULT"] = {\'ServerAliveInterval\': \'45\',
 4                      \'Compression\': \'yes\',
 5                      \'CompressionLevel\': \'9\'}
 6 config[\'bitbucket.org\'] = {}
 7 config[\'bitbucket.org\'][\'User\'] = \'hg\'
 8 config[\'topsecret.server.com\'] = {}
 9 topsecret = config[\'topsecret.server.com\']
10 topsecret[\'Host Port\'] = \'50022\'  # mutates the parser
11 topsecret[\'ForwardX11\'] = \'no\'  # same here
12 config[\'DEFAULT\'][\'ForwardX11\'] = \'yes\'
13 with open(\'example.ini\', \'w\') as configfile:
14     config.write(configfile)

其实本质上就是一个字典,下面我们来读取一下这个配置文件的内容:

1 import configparser
2 config = configparser.ConfigParser()
3 config.read("example.ini") #先读配置文件
4 # print(config.sections())
5 # print(config.default_section)
6 default  = config.default_section
7 print(default)
8 print(\'ServerAliveInterval= %s\\nCompressionLevel=%s ForwardX11=%s\'
9       %(config[default][\'ServerAliveInterval\'],config[default][\'CompressionLevel\'],config[default][\'ForwardX11\']))

上面就是配置文件的读取,各位大神在写代码的时候可以使用配置文件配置一些参数。

 九、logging模块

 1 # -*- coding:utf-8 -*-
 2 import logging
 3 logging.basicConfig(filename=\'12.log\',
 4                     format=\'%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s\',
 5                     datefmt=\'%Y-%m-%d %H:%M:%S %p\',
 6                     level=10)
 7 #help(logging)
 8 #%(asctime)s:表示datefmt的值    %(name)s:表示root %(levelname)s:表示bug的等级(debug,info,warning,error,critical,log)
 9 #%(module)s:模块名称  %(message)s\' 日志信息
10 logging.debug(u\'打印debug信息\')
11 logging.info(\'打印info信息\')
12 logging.warning(\'打印warning信息\')
13 logging.error(\'打印error信息\')
14 logging.critical(\'打印critical信息\')
15 logging.log(10,\'log日志\')

十、re模块

    用于正则表达式

 1 \'.\'     默认匹配除\\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
 2 \'^\'     匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\\nabc\\neee",flags=re.MULTILINE)
 3 \'$\'     匹配字符结尾,或e.search("foo$","bfoo\\nsdfsf",flags=re.MULTILINE).group()也可以
 4 \'*\'     匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac")  结果为[\'abb\', \'ab\', \'a\']
 5 \'+\'     匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果[\'ab\', \'abb\']
 6 \'?\'     匹配前一个字符1次或0次
 7 \'{m}\'   匹配前一个字符m次
 8 \'{n,m}\' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果\'abb\', \'ab\', \'abb\']
 9 \'|\'     匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果\'ABC\'
10 \'(...)\' 分组匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 结果 abcabca456c
11  
12  
13 \'\\A\'    只从字符开头匹配,re.search("\\Aabc","alexabc") 是匹配不到的
14 \'\\Z\'    匹配字符结尾,同$
15 \'\\d\'    匹配数字0-9
16 \'\\D\'    匹配非数字
17 \'\\w\'    匹配[A-Za-z0-9]
18 \'\\W\'    匹配非[A-Za-z0-9]
19 \'s\'     匹配空白字符、\\t、\\n、\\r , re.search("\\s+","ab\\tc1\\n3").group() 结果 \'\\t\'
20 [^a]    表示不包含a
21 \'(?P<name>...)\' 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city") 结果{\'province\': \'3714\', \'city\': \'81\', \'birthday\': \'1993\'}

下面看一下正则表达式的几个栗子: