python语法之常用内置模块
一、time模块
时间模块
1、获取时间戳(*****) print(time.time()) #1573871570.5133271 时间戳 time.sleep() 2、获取格式化时间(*****) 获取年月日 print(time.strftime('%Y-%m-%d')) #2019-11-16 获取年月日时分秒 print(time.strftime('%Y-%m-%d %H:%M:%S')) #2019-11-16 10:37:18 %X == %H:%M:%S print(time.strftime('%Y-%m-%d %X')) #2019-11-16 14:16:06 3、获取时间对象(*****) print(time.localtime()) print(type(time.localtime())) #<class 'time.struct_time'> time_obj = time.localtime() print(time_obj.tm_year) #2019 获取年 print(time_obj.tm_mon) #11 获取月 print(time_obj.tm_mday) #16 获取日 获取当前时间的格式化时间 print(time.strftime('%Y-%m-%d %X',time.localtime())) #2019-11-16 14:24:01 将时间对象转为格式化时间 res = time.localtime() #res是时间对象 print(time.strftime('%Y-%m-%d %X',res)) #2019-11-16 14:26:15 将字符串格式的时间转为时间对象 res = time.strptime('2019-11-16','%Y-%m-%d') print(res)
二、datetime模块
获取当前年月日(*******) print(datetime.date.today()) # 2019-11-16 # 获取当前年月日时分秒(*******) print(datetime.datetime.today()) #2019-11-16 15:00:45.868785 time_obj = datetime.datetime.today() print(type(time_obj)) #<class 'datetime.datetime'> print(time_obj.year) #2019 print(time_obj.month) #11 print(time_obj.day) #16 # 从索引0开始计算周一 UTC print(time_obj.weekday()) # 0-6 ISO print(time_obj.isoweekday()) # 1-7 UTC时区(*******) 北京时间 print(datetime.datetime.now()) #2019-11-16 15:03:02.699611 格林威治 print(datetime.datetime.utcnow()) #2019-11-16 07:03:02.699611
三、random模块
随机模块
import random ## 默认获取0——1之间任意小数 print(random.random()) ## 随机获取1—9中任意的整数 print(random.randint(1,9)) ## 随机获取可迭代对象中的某一个值 list1 = ['红桃A', '梅花A', '红桃Q', '方块K'] res3 = random.choice(list1) print(res3) #洗牌 #将可迭代中的值进行乱序 list1 = ['红桃A', '梅花A', '红桃Q', '方块K'] random.shuffle(list1) print(list1) # 需求: 随机验证码 ''' 需求: 大小写字母、数字组合而成 组合5位数的随机验证码 前置技术: - chr(97) # 可以将ASCII表中值转换成对应的字符 # print(chr(101)) - random.choice ''' # 获取任意长度的随机验证码 def get_code(n): #n是想要的组合长度 code = '' #每次循环只从大写小字母、数字中取出一个字符 for line in range(n): #n是想要的组合长度,即循环次数 #随机获取一个小写字母 res1 = random.randint(97, 122) lower_str = chr(res1) #随机获取一个大写字母 res2 = random.randint(65, 90) upper_str = chr(res2) #随机获取一个数字 number = str(random.randint(0, 9)) #将小写,大写,数字放到列表 code_list = [lower_str, upper_str, number] #随机从列表选出一个 random_code = random.choice(code_list) #将选出的放在字符串中 code += random_code #将code返回出去 return code code = get_code(5) print(code) #验证码组合结果M64G8 print(len(code)) #验证码长度
四、os与操作系统交互的模块
import os #需求: 获取当前项目根目录 ## 1、获取当前文件中的上一级目录 P_PATH = os.path.dirname(__file__) #D:/python/Pythons/p ## 2、项目的根目录,路径相关的值都用 “常量” BASE_PATH = os.path.dirname(P_PATH) #D:/python/Pythons ## 3、路径的拼接: 拼接文件 “绝对路径” TEST1_PATH = os.path.join(P_PATH, 'b.txt') # b.txt TEST2_PATH = os.path.join(P_PATH, 'a.txt') ## 4、判断“文件/文件夹”是否存在:若文件存在返回True,若不存在返回False print(os.path.exists(TEST1_PATH)) #b.txt 存在,True print(os.path.exists(TEST2_PATH)) #没有这个文件,False # # 5、判断“文件夹”是否存在 print(os.path.isdir(TEST1_PATH)) #False print(os.path.isdir(P_PATH)) #True # # 5、创建文件夹 DIR_PATH = os.path.join(P_PATH,'c.txt') os.mkdir(DIR_PATH) #检查一下看看创建好没有 print(os.path.isdir(DIR_PATH)) #刚才创建成功 ,所以结果为True ## 6、删除文件夹: 只能删除 “空的文件夹” os.rmdir(DIR_PATH) #OSError: [WinError 145] 目录不是空的。: 'D:/python/Pythons/p\\c.txt' #示范:先创建一个新的,然后再删除 NEW_DIR_PATH = os.path.join(P_PATH,'d.txt') # os.mkdir(NEW_DIR_PATH) #创建完成 os.rmdir(NEW_DIR_PATH) # 删除成功,因为这是一个空文件夹 ## 7、获取某个文件夹中所有文件的名字 file_list = os.listdir(r'D:\python\Pythons\p\c.txt') print(file_list) #['e.txt', 'q.txt', 'w.txt'] # enumerate(可迭代对象) ---> 得到一个对象,对象有一个个的元组(索引, 元素) res = enumerate(file_list) print(list(res)) #[(0, 'e.txt'), (1, 'q.txt'), (2, 'w.txt')]
五、sys模块
import sys import os #获取当前的python解释器的环境变量路径 print(sys.path) #将当前项目添加到环境变量中 BASE_PATH = os.path.dirname(os.path.dirname(__file__)) sys.path.append(BASE_PATH) #获取cmd终端的命令行 python3 py文件 用户名 密码 print(sys.argv) # 返回的是列表[''] ['D:/python/Pythons/p/sys.py']
六、hashlib模块
import hashlib md5_obj = hashlib.md5() # print(type(md5_obj)) #<class '_hashlib.HASH'> str1 = '1234' ##update中一定要传入bytes类型数据 md5_obj.update(str1.encode('utf-8')) ##得到一个加密后的字符串 res = md5_obj.hexdigest() # print(res) #81dc9bdb52d04dc20036dbd8313ed055 # 以上操作撞库有可能会破解真实密码 # 防止撞库问题: 加盐 import hashlib def pwd_md5(pwd): md5_obj = hashlib.md5() str1 = md5_obj.update(str1.encode('utf-8')) #创造盐 sal = '这一个有味道的盐' #加盐 md5_obj.update(sal.encode('utf-8')) #得到一个加密后的字符串 res =md5_obj.hexdigest() return res # #模拟用户登陆操作 ##获取文件中的用户名与密码 with open('user.txt','r',encoding='utf-8')as f: user_str = f.read() file_user, file_pwd = user_str.split(':') ##用户输入用户名与密码 username = input('请输入用户名:').strip() password = input('请输入密码:').strip() #1234 ##校验用户名与密码是否一致 if username == file_user and file_pwd == pwd_md5(password): #pwd_md5('1234') print('登录成功') else: print('登录失败')
七、json模块
json模块是一个序列化模块
json:
是一个第三方的特殊数据格式
可以将python数据类型————》json数据类型————》字符串————》文件中
其他语言要想使用python的数据:
文件中————》json数据类型————》字符串————》文件中
注意: 在json中,所以的字符串都是双引号
元祖比较特殊:
python中的元祖,若转成json,内部会将元祖————》列表
set 不能转成json类型
为什么使用json?
为了让不同语言之间数据共享。
如何使用
import json
json.dumps()
json.loads()
json.dump()
json.load()
import json list = ['目录', '上午'] #序列化 json_str = json.dumps(list, ensure_ascii=False) print(json_str) #["目录", "上午"] 序列化的内容会变成双引号 print(type(json_str)) #<class 'str'> ##反序列化 name = json.loads(json_str) print(name) #['目录', '上午'] print(type(name)) #<class 'list'> #元祖 #序列化 tuple = ('目录', '上午') json_t = json.dumps(tuple, ensure_ascii=False) print(json_str) #["目录", "上午"] #反序列转化时会将元祖——》列表 print(json.loads(json_t)) #['目录', '上午'] #字典 dict = { 'name': 'aaa', 'age': 18 } json_d = json.dumps(dict,ensure_ascii=False) print(json_d) #{"name": "aaa", "age": 18} #反序列化 print(json.loads(json_d)) #{'name': 'aaa', 'age': 18} #集合不能转成json数据 set = {'a', 'b'} set_json = json.dumps(set,ensure_ascii=False) print(set_json) TypeError: Object of type 'set' is not JSON serializable #序列化的数据保存到文件 with open('text.txt','w',encoding='utf-8')as f: f.write(json.dumps(list, ensure_ascii=False)) #文件内容["目录", "上午"] 从文件打开序列化数据 #注册功能: def register(): u = input('用户名:').strip() p = input('密码:').strip() re_p = input('确认密码:').strip() if p == re_p: user_dic = { 'name': u, 'password': p } json_str = json.dumps(user_dic, ensure_ascii=False) #开始写入文件 #注意:保存json数据时,用.json作为文件后缀名 with open('user.json', 'w', encoding='utf-8')as f: f.write(json_str) register()
#dump,load的用法 dic = { 'name': 'b', 'name1': 'c' } with open('user1.json', 'w', encoding='utf-8')as f: json.dump(dic, f) #{"name": "b", "name1": "c"} 省略f.write #读出文件json数据 with open('user1.json', 'r', encoding='utf-8')as f: user_str = json.load(f) #省略f.read print(user_str) #{'name': 'b', 'name1': 'c'}
八、pickle模块
pickle是一个python自带的序列化模块。
优点:
- 可以支持python中所有的数据类型
- 可以直接存 "bytes类型" 的数据,pickle存取速度更快
缺点: (致命的缺点)
- 只能支持python去使用,不能跨平台
import pickle #写dump set = {'a', 'b', 'c'} # with open('pik.pickle', 'wb')as f: # pickle.dump(set, f) #读 load with open('pik.pickle', 'rb')as f: pyhton_set = pickle.load(f) print(pyhton_set) #{'a', 'b', 'c'} print(type(pyhton_set)) #<class 'set'>
九、collections模块
- python默认八大数据:
- 整型
- 浮点型
- 字符串
- 字典
- 元组
- 列表
- 集合
- 布尔
collections模块:
- 提供一些python八大数据类型 “以外的数据类型” 。
- 具名元组:
具名元组 只是一个名字。
应用场景:
- 坐标
-
from collections import namedtuple
- 有序字典:
- python中字典默认是无序
- collections中提供了有序的字典
from collections import OrderedDict
#具名元祖 from collections import namedtuple #下面三种形式都可以 point = namedtuple('坐标', ['x', 'y']) # 第二个参数既可以传可迭代对象 point1 = namedtuple('坐标', ('x', 'y')) point2 = namedtuple('坐标', 'x y') # # 会将 1 ---> x, 2 ---> y # 传参的个数,要与namedtuple第二个参数的个数一一对应 # p = point(1, 3) # 本质上传了4个,面向对象讲解 print(p) #坐标(x=1, y=3) print(type(p)) #<class '__main__.坐标'> # 扑克牌: # 获取扑克牌对象 card = namedtuple('扑克牌', ['color', 'number']) red_a = card('红桃', 'a') print(red_a) #扑克牌(color='红桃', number='a') #演员信息 p = namedtuple('max', 'city age hobby') pp = p('china', '17', 'read') print(pp) #max(city='china', age='17', hobby='read') #有序字典 from collections import OrderedDict oder_dic = OrderedDict({'x': 1, 'y': 2, 'z': 3}) print(oder_dic) #OrderedDict([('x', 1), ('y', 2), ('z', 3)]) 变成有序的字典,里面是列表套元祖 print(type(oder_dic)) #<class 'collections.OrderedDict'> print(oder_dic['y']) #2 取元素 print(oder_dic.get('y')) #2 取元素 for line in oder_dic: print(line) #x y z
十、openpyxl模块
openpyxl模块:第三方模块
- 可以对Excle表格进行操作的模块
- 下载:
pip3 install openpyxl
- Excel版本:
2003之前:
excle名字.xls
2003以后:
excle名字.xlsx
- 清华源: https://pypi.tuna.tsinghua.edu.cn/simple
- 配置永久第三方源:
D:\Python36\Lib\site-packages\pip\_internal\models\index.py
# 写入数据 # from openpyxl import Workbook # # 获取Excel文件对象 # wb_obj = Workbook() # # wb1 = wb_obj.create_sheet('python工作表1', 1) # wb2 = wb_obj.create_sheet('python工作表2', 2) # # # 修改工作表名字: 为python13期工作表1标题修改名字 ---》 tank大宝贝 # print(wb1.title) # wb1.title = 'tank大宝贝' # print(wb1.title) # 为第一张工作表添加值 # wb1['工作簿中的表格位置'] # wb1['A10'] = 200 # wb1['B10'] = 1000 # wb1['C10'] = '=SUM(A10:B10)' # # # wb2['A1'] = 100 # # # 生成Excel表格 # wb_obj.save('python.xlsx') # print('excel表格生成成功') # 读取数据 # from openpyxl import load_workbook # wb_obj = load_workbook('python.xlsx') # print(wb_obj) # # # wb_obj['表名'] # wb1 = wb_obj['tank大宝贝'] # print(wb1['A10'].value) # wb1['A10'] = 20 # print(wb1['A10'].value) # 批量写入100条数据 from openpyxl import Workbook wb_obj = Workbook() wb1 = wb_obj.create_sheet('工作表1') # wb1['表格位置'] = 对应的值 # n = 1 # for line in range(100): # # wb1['A%s' % n] = line + 1 # n += 1 # 假设: 一万条数据的字典 dict1 = { 'name': 'tank', 'age': 17 } n = 1 init_val = 65 chr(65) # 65-90 for key, value in dict1.items(): wb1['A%s' % n] = key wb1['B%s' % n] = value n += 1 wb_obj.save('批量插入的数据2.xlsx')