模块简介
一、time模块
二、sys模块
三、datetime模块
四、pickle模块
五、json模块
六、OS模块
七、hashlib加密模块
八、第三方模块的安装方法
九、requests模块
十、XML模块
十一、configparser模块
十二、shutil
十三、subprocess模块
十四、logging模块
模块的分类
1、内置模块
2、自定义模块
3、第三方模块(需要安装)
模块前言:模块的导入:
模块的导入有两点需要注意:
1、在sys.path中的可以直接进行导入,因为sys.path返回的是列表,所以可以利用append把路径加入到列表当中
2、把模块导入后,再次导入模块,python会检测内存中是否存在该模块,如果存在该模块则会忽略导入
一、time模块
1、time.sleep(5) #等待5秒钟
#!usr/bin/env python # -*- coding:utf-8 -*- import time print('start to sleep.....') time.sleep(5) #等待5秒 print('wake up.....')
#!usr/bin/env python # -*- coding:utf-8 -*- import time print(time.clock()) #返回处理器时间,3.3已经废弃 print(time.process_time()) #返回处理器时间,3.3已经废弃 print(time.time()) #返回时间戳,1970年1月1号0:00至现在一共多少秒,所有系统的时间戳都是从该时间计时的 print(time.ctime(time.time())) #将时间戳转化为字符串,Thu Feb 16 10:10:20 2017 print(time.ctime(time.time()-24*60*60)) #将时间转化为字符串,昨天的这个时间,Thu Feb 15 10:10:20 2017 print(time.gmtime(time.time())) #返回time.struct_time对象,可以分别提取年月日时分秒 print(time.localtime(time.time())) #返回time.struct_time对象,对象显示的是本地时间,可以分别提取年月日时分秒 print(time.mktime(time.localtime(time.time()))) #与localtime功能相反,将time.struct_time对象转化为时间戳 print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))) #将time.struct_time对象转化为字符串格式
print(time.strftime('%Y-%m-%d %H:%M:%S') #输出当前时间
print(time.strptime('2017-2-16 11:40:27','%Y-%m-%d %H:%M:%S')) #将字符串转化为time.struct_time对象
#!usr/bin/env python # -*- coding:utf-8 -*- #time.gmtime()的用法 #time.localtime()的用法 import time time_object = time.gmtime(time.time()) print(time_object) #time.struct_time(tm_year=2017, tm_mon=2, tm_mday=16, # tm_hour=2, tm_min=35, tm_sec=54, tm_wday=3, tm_yday=47, tm_isdst=0) time_str = '%s-%s-%s %s:%s:%s' %(time_object.tm_year,time_object.tm_mon,time_object.tm_mday,time_object.tm_hour,time_object.tm_min,time_object.tm_sec) print(time_str) #2017-2-16 2:45:26 格林威治时间
二、sys模块
1)sys.argv ----命令参数List,第一个参数是程序本身路径
import sys print(sys.argv) if sys.argv[1] == 'one': print('11111') else: print('.....')
在终端中运行结果如下:
E:\python_code\2\11day>python time2.py one
['time2.py', 'one']
11111
2)sys.path ----返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
#!usr/bin/env python # -*- coding:utf-8 -*- import sys print(sys.path) #打印输出: #['E:\\python_code\\2\\11day', # 'E:\\python_code\\2', # 'D:\\python_lib', # 'D:\\Program Files (x86)\\Python36\\python36.zip', # 'D:\\Program Files (x86)\\Python36\\DLLs', # 'D:\\Program Files (x86)\\Python36\\lib', # 'D:\\Program Files (x86)\\Python36', # 'D:\\Program Files (x86)\\Python36\\lib\\site-packages']
当导入python包时,会从sys.path路径返回的列表中查找包,找到则运行,并返回。
一般第三方安装的路径都是在:
D:\\Program Files (x86)\\Python36\\lib\\site-packages
3)sys.exit(n) ----退出程序,正常退出时exit(0)
#!usr/bin/env python # -*- coding:utf-8 -*- import sys st = input('退出程序:q;输入1打印one;输入2打印two:') if st == 'q': sys.exit('goodbye!') #也可以用:exit('goodbye!'),退出当前程序 elif st == '1': print('one') elif st == '2': print('two') print('thanks!')
4)sys.version ----获取python解释器程序的版本信息
#!usr/bin/env python # -*- coding:utf-8 -*- import sys print(sys.version) #打印输出: #3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)]
5)sys.platform ----返回操作系统平台名称
#!usr/bin/env python # -*- coding:utf-8 -*- import sys print(sys.platform) #打印输出win32
6)sys.stdout.wirte("#") #在同一行中输出字符串,可以做进度条原理
pip.exe install django ----从网络下载django并安装,显示安装百分比和进度条
pip uninstall django ----卸载django
import sys import time for i in range(20): sys.stdout.write('#') time.sleep(0.3)
在终端中输入上面的代码,可以像进度条一样不断输出#
7)sys.stdin.readline() #屏幕输入函数
#!usr/bin/env python # -*- coding:utf-8 -*- import sys val = sys.stdin.readline()[:-1] #[:-1]可以用切片截取输入的字符串 print(val) #将输入的内容打印出来,input函数底层实际也调用的这个函数
8) 练习:
读取用户输入的目录,根据用户的输入,创建一个相应的目录
# -*- coding:utf-8 -*- import sys,os os.mkdir(sys.argv[1])
自己写一个简单的脚本,可以在任何路径导入
自己做一个带百分比的进度条
#!usr/bin/env python # -*- coding:utf-8 -*- import sys,time for i in range(11): sys.stdout.write('\r') #回车符 sys.stdout.write('%s%% %s' %(i *10,'#' * i)) sys.stdout.flush() #从显存刷新到屏幕,没打印一次刷新一次屏幕 time.sleep(0.2)
三、datetime模块
#时间加减 import datetime print(datetime.datetime.now()) #返回 2016-08-19 12:47:03.941925 print(datetime.date.fromtimestamp(time.time()) ) # 时间戳直接转成日期格式 2016-08-19 print(datetime.datetime.now() ) print(datetime.datetime.now() + datetime.timedelta(3)) #当前时间+3天 print(datetime.datetime.now() + datetime.timedelta(-3)) #当前时间-3天 print(datetime.datetime.now() + datetime.timedelta(hours=3)) #当前时间+3小时 print(datetime.datetime.now() + datetime.timedelta(minutes=30)) #当前时间+30分,
参数:days=0, seconds=0, microseconds=0,
milliseconds=0, minutes=0, hours=0, weeks=0
c_time = datetime.datetime.now() print(c_time.replace(minute=3,hour=2)) #时间替换
四、pickle模块
1、把字典转化为字符串写入文件
#!usr/bin/env python # -*- coding:utf-8 -*- accounts = {1000: {'name':'sunshuhai', 'email':'888@163.com', 'password':'888888', 'balance':15000, 'phone':'13863366666', 'bank_num':{'ICBC':'6220216160004852','CBC':'64545455'} }, 1001: {'name': 'zhangsan', 'email': '777@163.com', 'password': '777777', 'balance': 12000, 'phone': '13863377777', 'bank_num': {'ICBC': '62224855', 'CBC': '88045454'} }, } f = open('ac.txt','w',encoding='utf-8') text = str(accounts) print(text) f.write(text) f.close()
但写入文件后,进行无法进行修改,所以可以用pickle模块
2、pickle把字典转为字节类型存入文件
#!usr/bin/env python # -*- coding:utf-8 -*- accounts = {1000: {'name':'sunshuhai', 'email':'888@163.com', 'password':'888888', 'balance':15000, 'phone':'13863366666', 'bank_num':{'ICBC':'6220216160004852','CBC':'64545455'} }, 1001: {'name': 'zhangsan', 'email': '777@163.com', 'password': '777777', 'balance': 12000, 'phone': '13863377777', 'bank_num': {'ICBC': '62224855', 'CBC': '88045454'} }, } import pickle f = open('ac.txt','wb') text = pickle.dumps(accounts) #返回的是(bytes)字节类型,将字典类型转化为字节类型,不管以何种方式打开文件,均返回字节型,所以必须用wb方式打开可以直接写入 f.write(text) #写入文件 f.close()
dumps与loads均以字节的形式写入和读取的
#!usr/bin/env python # -*- coding:utf-8 -*- import pickle f = open('ac.txt','rb') f_read = f.read() #把pickle写入的字符串还原为字节形式 print(f_read) dic_text = pickle.loads(f_read) #pickle.dumps存储的字符串转化为字典 print(type(dic_text)) #打印输出:<class 'dict'>
例子:修改文件中ID为1000的balance的值+500
#!usr/bin/env python # -*- coding:utf-8 -*- import pickle f = open('ac.txt','rb') text = f.read() #读取文本内容 dic_text = pickle.loads(text) #利用pickle将文本内容转化为字典类型 dic_text[1000]['balance'] += 500 #修改字典中的值 f.close() f = open('ac.txt','wb') text_write = pickle.dumps(dic_text) #将字典转化为文本内容 f.write(text_write) #把文本内容重新覆盖写入文件 f.close() f = open('ac.txt','rb') text_read = f.read() #读取文件中的文本内容 text_dic = pickle.loads(text_read) #利用pickle将文本内容转化为字典 print(type(text_dic),text_dic) #打印字典的类型和字典内容
3、pickle中的dump和load 与 dumps和loads的区别
dumps可以将字典转为字节,然后以字节方式打开写入文件
dump 可以直接将字典以字节方式打开的文件
loads 可以将字节类型的字符串,直接转化为字典
load可以将以字节方式打开的文件对象直接转化为字典
#!usr/bin/env python # -*- coding:utf-8 -*- accounts = {1000: {'name':'sunshuhai', 'email':'888@163.com', 'password':'888888', 'balance':15000, 'phone':'13863366666', 'bank_num':{'ICBC':'6220216160004852','CBC':'64545455'} }, 1001: {'name': 'zhangsan', 'email': '777@163.com', 'password': '777777', 'balance': 12000, 'phone': '13863377777', 'bank_num': {'ICBC': '62224855', 'CBC': '88045454'} }, } import pickle f = open('ac.txt','wb') pickle.dump(accounts,f) #dump可以直接把字典写入文件 f.close() f = open('ac.txt','rb') dic = pickle.load(f) #load可以直接把文件内容读出为字典类型 print(type(dic),dic)
五、json模块
json模块与pickle模块用法一致;
区别:
1、pickle模块已字节的方式进行转化,而json是以字符串的方式进行转化。
2、pickle模块可以将任何数据类型序列化,但json不支持某些数据类型的序列化,如data,json只支持字典、列表、简单的变量、字符串等,json不支持元组,稍微复杂的数据类型就不能处理了
3、pickle只在python语言支持,不同语言之间、不同系统之间的接口、数据交互为了通用性,一般选择json。
dumps和loads的用法:
#!usr/bin/env python # -*- coding:utf-8 -*- accounts = {1000: {'name':'sunshuhai', 'email':'888@163.com', 'password':'888888', 'balance':15000, 'phone':'13863366666', 'bank_num':{'ICBC':'6220216160004852','CBC':'64545455'} }, 1001: {'name': 'zhangsan', 'email': '777@163.com', 'password': '777777', 'balance': 12000, 'phone': '13863377777', 'bank_num': {'ICBC': '62224855', 'CBC': '88045454'} }, } import json f = open('ac.txt','w',encoding='utf-8') text = json.dumps(accounts) #将字典转化为字符串 f.write(text) #将转化后的字符串写入文件 f.close() f = open('ac.txt','r',encoding='utf-8') text1 = f.read() #读取文件中的字符串 dic = json.loads(text1) #将字符串转化为字典 print(type(dic),dic) f.close()
dump和load的用法:
#!usr/bin/env python # -*- coding:utf-8 -*- accounts = {1000: {'name':'sunshuhai', 'email':'888@163.com', 'password':'888888', 'balance':15000, 'phone':'13863366666', 'bank_num':{'ICBC':'6220216160004852','CBC':'64545455'} }, 1001: {'name': 'zhangsan', 'email': '777@163.com', 'password': '777777', 'balance': 12000, 'phone': '13863377777', 'bank_num': {'ICBC': '62224855', 'CBC': '88045454'} }, } import json #dump和load f = open('ac.txt','w',encoding='utf-8') json.dump(accounts,f) #直接将accounts转化为文本,写入f对象 f.close() f = open('ac.txt','r',encoding='utf-8') dic = json.load(f) #直接读取f对象中的文件,并转化为字典 print(type(dic),dic)
注意:python代码中列表、字典等内部尽量的字符串使用双号,如果将含有单引号的字符串传给json,则会报错,所以以后列表、字典等内部的字符串尽量使用双引号loads时使用双引号表示字符串,dumps可以使用单引号表示字符串,例如:
#!usr/bin/env python # -*- coding:utf-8 -*- import json st = '{"name":"sunshuhai","age":100}' #如果st = "{'name':'sunshuhai','age':100}"则会报错 st_dic = json.loads(st) print(type(st_dic),st_dic)
json不支持元组
tup = (11,22,33) import json r2 = json.dumps(tup) print(r2) #打印输出[11, 22, 33] s = '("11","22","33")' import json r1 = json.loads(s) print(r1) #会报错,因为json不支持元组,只支持列表和字典
六、OS模块
1 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 2 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd 3 os.curdir 返回当前目录: ('.') 4 os.pardir 获取当前目录的父目录字符串名:('..') 5 os.makedirs('dir1/dir2') 可生成多层递归目录 6 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 7 os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname 8 os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname 9 os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 10 os.remove() 删除一个文件 11 os.rename("oldname","new") 重命名文件/目录 12 os.stat('path/filename') 获取文件/目录信息 13 os.sep 操作系统特定的路径分隔符,win下为"\\",Linux下为"/" 14 os.linesep 当前平台使用的行终止符,win下为"\t\n",Linux下为"\n" 15 os.pathsep 用于分割文件路径的字符串 16 os.name 字符串指示当前使用平台。win->'nt'; Linux->'posix' 17 os.system("bash command") 运行shell命令,直接显示
os.popen("dir") 运行shell命令,返回结果 18 os.environ 获取系统环境变量 19 os.path.abspath(path) 返回path规范化的绝对路径 20 os.path.split(path) 将path分割成目录和文件名二元组返回 21 os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素 22 os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素 23 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False 24 os.path.isabs(path) 如果path是绝对路径,返回True 25 os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False 26 os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False 27 os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 28 os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间 29 os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
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)是创建时间(详细信息参见平台的文档)