random模块相关方法
需要掌握的,未提及的建议自行了解
import random
大于0且小于1之间的小数 (不含1)
random.random() # 0.38916016381720087
指定区间 指定start到end(不含end)之间的随机小数
random.uniform(0, 10) # 8.080921224222864
指定区间 指定start到end(含end)之间的随机整数
random.randint(1, 20) # 14
指定区间 指定start到end(不含end)之间的随机整数
random.randrange(1, 20) # 14
指定区间 指定start到end(不含end)之间的随机整数 第三个参数是步长 同python自带的range
random.randrange(1, 20, 5) # 6
随机取可迭代类型中的一个
nameList = ["小满", "大乔", "王昭君"]
random.choice(nameList) # 大乔
random.choice(tuple(nameList)) # 王昭君
random.choice("你是年少的欢喜") # 少
随机取可迭代类型中的多个(返回结果是列表)
nameList = ["小满", "大乔", "王昭君"]
random.sample(nameList, 2) # ['大乔', '王昭君']
random.sample("你是年少的欢喜", 3) # ['的', '少', '欢']
另外一种方法
nameList = ["小满", "大乔", "王昭君"]
heroList = random.choices(nameList, k=2)
print(heroList) # ['大乔', '小满']
洗牌,打乱原列表顺序(无返回值)
nameList = ["小满", "大乔", "王昭君"]
random.shuffle(nameList)
print(nameList) # ['王昭君', '大乔', '小满']
小练习
随机生成N个验证码
import string
import random
def symbol_code(number, length):
"""
number: 验证码个数
length: 验证码长度
return: 包含全部验证码的列表
"""
text = string.ascii_letters + string.digits
symbol_list = []
for line in range(length):
symbol = "".join(random.sample(text, number))
symbol_list.append(symbol)
return symbol_list
OS模块使用方法
需要掌握,未提及的建议自行了解
获取当前脚本绝对路径
import os
file_path = os.path.abspath(__file__)
print(file_path)
获取当前文件的上级目录
import os
base_path = os.path.dirname(os.path.abspath(路径))
print(base_path)
路径拼接
import os
bese_path = "E:\小满"
new_path = os.path.join(bese_path, "document", "img", "三岁啦.jpg")
print(new_path)
E:\小满\document\img\三岁啦.jpg
判断路径是否纯在
存在返回True 不存在返回False
import os
path = "E:\小满\记录生活\二次元"
exists = os.path.exists(path)
print(exists)
False
创建文件夹(若存在同名文件则报错)
import os
# 创建单个文件夹
os.mkdir("琶洲漫展")
import os
path = "E:\小满\记录生活\二次元"
if not os.path.exists(path):
# 俺路径规律批量创建文件夹
os.makedirs(path)
是否为文件
import os
path = "E:\小满\记录生活\二次元\with_friends.jpg"
is_file = os.path.isfile(path)
print(is_file)
True
是否为文件夹
import os
path = "E:\小满\记录生活\二次元"
is_dir = os.path.isdir(path)
print(is_dir) # True
file_path = os.path.join(path, "with_friends.png")
is_dir = os.path.isdir(file_path) # False
print(is_dir)
切割路径
import os
path = "E:\小满\记录生活\二次元\with_friends.jpg"
file_tuple = os.path.split(path)
print(file_tuple)
('E:\\小满\\记录生活\\二次元', 'with_friends.jpg')
获取结尾文件/文件夹名称
import os
path = "E:\小满\记录生活\二次元"
print(os.path.basename(path)) # 二次元
path = "E:\小满\记录生活\二次元\with_friends.jpg"
print(os.path.basename(path)) # with_friends.jpg
删除文件
import os
os.remove("文件路径")
删除单个文件夹(如果文件夹里面有文件存在则报错)
import os
os.rmdir("琶洲漫展")
递归删除多级文件夹(如果文件夹里面有文件存在则报错)
import os
dir_path = "E:\小满\记录生活\二次元\琶洲漫展"
os.removedirs(dir_path)
OSError: [WinError 145] 目录不是空的。: 'E:\\小满\\记录生活\\二次元\\琶洲漫展'
如果文件夹全部为空了,那么才可以递归去删除
import os
dir_path = "E:\小满\记录生活\二次元\琶洲漫展"
os.removedirs(dir_path) # 成功删除下面的所有文件夹
切换工作路径(相当于shell下cd)
import os
os.chdir(path)
重命名文件或者文件夹
import os
os.rename("旧名字", "新名字")
import os
dir_path = "E:\小满\记录生活\二次元\琶洲漫展"
os.chdir(dir_path)
os.rename("with_friends.jpg", "best_friends.jpg")
查看当前文件夹下的所有文件和文件夹
import os
dir_path = "E:\小满\记录生活\二次元\琶洲漫展"
os.chdir(dir_path)
os.mkdir("待整理")
elements = os.listdir(dir_path)
print(elements)
['best_friends.jpg', '待整理']
获取当前工作路径
import os
dir_path = "E:\小满\记录生活\二次元\琶洲漫展"
os.chdir(dir_path)
print(os.getcwd())
E:\小满\记录生活\二次元\琶洲漫展
运行shell命令
import os
os.system("shell命令")
import os
os.system("pip install -r requirements.txt")
将路径字符串转换为适合当前操作系统的标准化形式
注:window的是\,Linux和Mac平台是/
import os
path = "E:\小满\记录生活\二次元\琶洲漫展"
new_path = os.path.join(path, "待整理/王者荣耀区/被偷拍了.jpg")
print(new_path)
E:\小满\记录生活\二次元\琶洲漫展\待整理/王者荣耀区/被偷拍了.jpg
rel_path = os.path.normcase(new_path)
print(rel_path)
e:\小满\记录生活\二次元\琶洲漫展\待整理\王者荣耀区\被偷拍了.jpg
json模块
什么是序列化 & 反序列化
内存中的数据类型---->序列化---->特定的格式(json或者pickle格式)
内存中的格式<----反序列化<----特定的格式(json或者pickle格式)
土办法:
{"aaa":111}---->序列化str({"aaa":111})---->'{"aaa":111}'
{"aaa":111}<----反序列化eval('{"aaa":111}')<----'{"aaa":111}'
为何要序列化
序列化得到结果 ===> 特定的格式的内容有两种用途
1. 可以用于存储===>用于存档
2. 传输给其他平台使用===>跨平台数据交互
eg:
python dart
列表 特定的格式 数组
强调:
针对用途1的特定格式:可以是一种专用的格式===> pickle 只有python可以识别
针对用途2的特定格式:应该是一种通用,能够被所有语言识别的格式===>json
dumps方法
数据序列化
import json
data = [1, "2", '小满', True, False]
json_data = json.dumps(data)
print(json_data, type(json_data))
[1, "2", "\u5c0f\u6ee1", true, false] <class 'str'>
啊嘞?这些奇怪的符号是什么鬼!!!
在 Python 的 json
模块中,ensure_ascii
是一个可选参数,用于控制是否将非 ASCII 字符转义为 Unicode 转义序列。
当 ensure_ascii
设置为 True
(默认值)时,json
模块会将所有非 ASCII 字符(例如特殊字符、Unicode 字符)转义为类似 \uXXXX
的 Unicode 转义序列。这样做是为了确保 JSON
字符串中只包含 ASCII 字符,因为在某些情况下,一些系统或应用程序可能只支持 ASCII 字符。
当 ensure_ascii
设置为 False
时,json
模块会保留非 ASCII 字符,不进行转义。这样可以在 JSON
字符串中包含非 ASCII 字符,以支持更广泛的字符集。
搞定啦!!
import json
data = [1, "2", '小满', True, False]
json_data = json.dumps(data, ensure_ascii=False) # 这里设置为False就好了
print(json_data)
[1, "2", "小满", true, false]
注意点:
1. 布尔类型会变成小写
2. 单引号会变成双引号
loads方法
反序列化
import json
data = [1, "2", '小满', True, False]
json_data = json.dumps(data, ensure_ascii=False)
ls = json.loads(json_data)
print(ls, type(ls))
[1, '2', '小满', True, False] <class 'list'>
dump方法
序列化到文件
import json
data = [1, "2", '小满', True, False]
with open("data.json", "w", encoding="utf-8") as file:
# data正常的数据
# file文件的句柄
# ensure_ascii=False 保留非 ASCII 字符,不进行转义
json.dump(data, file, ensure_ascii=False)
load方法
从文件反序列化
import json
with open("data.json", encoding="utf-8") as file:
data = json.load(file)
print(data) # [1, '2', '小满', True, False]
补充:
josn
模块使用dump写入文件的时候,基本都是使用w模式,不会使用a模式。
hashlib模块
注:hash算法不算加密算法
md5加密
正常的情况下不可逆
from hashlib import md5
def md5_encryption(text: str):
md5_obj = md5() # 创建md5对象
md5_obj.update(text.encode("utf-8")) # # 加密数据 update里面必须是一个二进制数据
return md5_obj.hexdigest() # # 获取加密后的值,一个32位的字符串
# 调用
if __name__ == "__main__":
print(md5_encryption("小满")) # 2cb8e740ec7ba006709eea6adbf8da23
撞库
通俗一点讲,“撞库”就是黑客通过收集互联网上用户的账号和密码信息,生成对应的字典表,再尝试批量登录其他网站。以“撞运气”的形式“试”出可登录的用户名、密码。
尝试解决撞库的方案(加盐)
要在使用 Python 的 MD5 哈希函数时加盐,你可以将盐值与要哈希的数据连接在一起,然后再进行哈希运算。这样可以增加哈希的安全性,使其更难以破解。
import json
import hashlib
import random
import string
def run():
def hash_with_salt(text, salt):
md5 = hashlib.md5()
bytes_text = (text + salt).encode("utf-8") # 加盐
md5.update(bytes_text)
return md5.hexdigest()
def get_user_input():
username = input("输入账号:").strip()
password = input("输入密码:").strip()
return username, password
def save(data):
with open("user_pwd.json", "w", encoding="utf-8") as file:
json.dump(data, file, ensure_ascii=False)
# 随机生成4位验证码
def symbol_code(number=4):
text = string.ascii_letters + string.digits
symbol = "".join(random.sample(text, number))
return symbol
def register():
username, password = get_user_input()
symbol = symbol_code()
symbol_input = input(f"输入您看到的验证码 ->> {symbol} <<- :").strip()
if symbol_input.casefold() == symbol.casefold():
print(f"用户[{username}]已成功注册")
rel_password = hash_with_salt(username, symbol)
data = {username: {"username": username, "password": rel_password, "salt": symbol}}
save(data)
else:
print("验证码不对")
def login():
username, password = get_user_input()
with open("user_pwd.json", encoding="utf-8") as file:
user_data = json.load(file)
salt = user_data.get(username).get("salt")
rel_username = user_data.get("username")
rel_password = user_data.get(username).get("password")
new_password = hash_with_salt(username, salt)
if new_password == rel_password:
print(f"用户[{username}]登录成功")
else:
print("登录失败")
register()
login()
if __name__ == "__main__":
run()
输入账号: 小满
输入密码: 3
输入您看到的验证码 ->> 4osh <<- : 4osh
用户[小满]已成功注册
输入账号: 小满
输入密码: 3
用户[小满]登录成功
本地json文件
{"小满": {"username": "小满", "password": "b338fc469557472904ba8ef75c681d7d", "salt": "4osh"}}
时间模块
time模块
时间戳
从1970年到现在经过的秒数。作用:用于时间间隔的计算。
import time
time.time()
1702811565.8955057
格式化的时间字符串
import time
now = time.strftime("%Y年%m月%d日 %H时%M分%S秒")
print(now) # 2023年12月17日 19时13分44秒
now = time.strftime("%x %X")
print(now) # 12/17/23 19:14:04
lctime = time.localtime()
now = time.strftime("%x %X", lctime)
now # 12/17/23 19:14:16
结构化的时间
import time
lctime = time.localtime() # 本地时区的struct_time
print(lctime)
time.struct_time(tm_year=2023, tm_mon=12, tm_mday=17, tm_hour=19, tm_min=16, tm_sec=35, tm_wday=6, tm_yday=351, tm_isdst=0)
索引(Index) | 属性(Attribute) | 值(Values) |
---|---|---|
0 | tm_year(年) | 比如2023 |
1 | tm_mon(月) | 1 - 12 |
2 | tm_mday(日) | 1 - 31 |
3 | tm_hour(时) | 0 - 23 |
4 | tm_min(分) | 0 - 59 |
5 | tm_sec(秒) | 0 - 61 |
6 | tm_wday(weekday) | 0 - 6(0表示周日) |
7 | tm_yday(一年中的第几天) | 1 - 366 |
8 | tm_isdst(是否是夏令时) | 默认为-1 |
import time
gmtime = time.gmtime() # UTC时区的struct_time UTC(协调世界时)是一种标准的时间参考,它与时区无关,表示全球统一的时间。
print(gmtime)
time.struct_time(tm_year=2023, tm_mon=12, tm_mday=17, tm_hour=11, tm_min=32, tm_sec=41, tm_wday=6, tm_yday=351, tm_isdst=0)
将格式化的字符串时间按照模板转化成结构化时间
语法:time.strptime(string, format)
string = "2023-12-7 19-42-09"
lctime = time.strptime(string, "%Y-%m-%d %H-%M-%S")
print(lctime)
time.struct_time(tm_year=2023, tm_mon=12, tm_mday=7, tm_hour=19, tm_min=42, tm_sec=9, tm_wday=3, tm_yday=341, tm_isdst=-1)
转换规律
字符串时间 ----> struct_time ----> 时间戳
string = "2023-12-7 19-42-09"
lctime = time.strptime(string, "%Y-%m-%d %H-%M-%S")
t = time.mktime(lctime)
print(t) # 1701949329.0
时间戳 ----> struct_time ----> 字符串时间
lctime = time.localtime(t)
now = time.strftime("%x %X", lctime)
print(now) # 12/17/23 19:50:50
奇怪的知识增加了
time.asctime() 同 time.ctime()
t1 = time.asctime() # Sun Dec 17 19:51:21 2023
t2 = time.ctime() # Sun Dec 17 19:51:21 2023
注:图片来源于知乎 友情链接
datetime模块
import time
import datetime
print(datetime.datetime.now())
2023-12-17 20:03:24.682513
print(datetime.datetime.utcnow())
2023-12-17 12:02:19.587722
t = time.time()
print(datetime.datetime.fromtimestamp(t))
2023-12-17 20:03:26.793521
now = datetime.datetime.now()
print(now)
2023-12-17 20:04:57.955645
print(now + datetime.timedelta(3)) # 当前时间+3天
2023-12-20 20:04:57.955645
print(now + datetime.timedelta(-3)) # 当前时间-3天
2023-12-14 20:04:57.955645
print(now + datetime.timedelta(days=-3)) # 当前时间-3天
2023-12-14 20:04:57.955645
print(now + datetime.timedelta(minutes=30)) # 当前时间+30分钟
2023-12-17 20:34:57.955645
print(now + datetime.timedelta(hours=2)) # 当前时间+2小时
2023-12-17 22:04:57.955645
待更新
标签:内置,python,time,tm,模块,import,print,path,os From: https://www.cnblogs.com/ccsvip/p/17909729.html