random、os、json模块

发布时间 2024-01-04 16:31:01作者: Formerly0^0

常用模块

1. random模块

1.1 随机小数字

# 1.默认区间的小数 random.random() 
# 大大于0且小与1之间的小数
import random
data = random.random()
print(data) # 0.7412470737488398

# 2.生成指定区间小数random.uniform(起始值,终止值)
data = random.uniform(1,10)
print(data) # 3.7820168013687585

1.2 随机整数

# 1.随声生成区间整数
# random.randint(1,5)生成1到5之前的整数,包括1和5
import random
data = random.randint(1,5)
print(data) 3

# 2.随机区间奇偶数
# random.randrange(1, 10, 2) 随机1到10之前的奇数
data = random.randrange(1, 10, 2)
print(data) # 3

1.3 随机选择返回

# 1.随机返回一个
# random.choice(num_list)从num_list列表随机返回一个
import random
num_list = [1,2,3,4]
num = random.choice(num_list)
print(num) # 3

# 2.随机返回指定个数
# random.sample(num_list,2)从num_list里随机返回2个出来
import random
num_list = [1,2,3,4]
num = random.sample(num_list,2)
print(num) # 1,4

random练习

# 登录练习 : 大小写子母 + 数字混合 (指定个数)
# 登录的时候给一个验证码 ---> 输入正确的验证码才能登录成功
# 否则登录失败

def create_code(num):
  # 声名一个空字符串
  code = ''
  # 循环拿随机数
  for i in range(num):
    #创建验证码
    num_one = str(random.randint(0, 9))
    letter_one = chr(random.randint(97, 122))
    letter_two = chr(random.randint(65, 90))
   	# 组合验证码
    data = random.choice([num_one,letter_one,letter_two])
    code += data
  return code


def login():
  code = create_code(4)
  new_code = input(f"{code}:")
  if new_code != code:
    print("验证码错误")
  else:
    print("登陆成功")

2. os模块

2.1 路径相关

# 路径操作
# 获取当前文件所在文件夹的路径,当前文件的上层路径
# os.path.dirname(__file__)
# /Users/chenxu/Documents/pythonProjects28/ATM
BASE_DIR = os.path.dirname(__file__)

# 获取当前文件的绝对路径
# os.path.abspath(path)
# /Users/chenxu/Documents/pythonProjects28/ATM/setting.py
abspath= os.path.abspath(__file__)

# 拼接路径
# os.path.join()
# /Users/chenxu/DocumentythonProjects28/ATM/database/pwd
PWD_DIR = os.path.join(DB_DIR, 'pwd')

# 判断当前路径是否存在
# os.path.exists(path)
exists = os.path.exists(p1)


# 切割路径
FILE_PATH = os.path.abspath(__file__)
# /Users/chenxu/Documents/pythonProjects28/day19/os模块.py
# 对路径进行切割,根据最后一个/切割,把模块明切割出来了 --- 切割成元组
file_path_list = os.path.split(FILE_PATH)
print(file_path_list) 
# ('/Users/chenxu/Documents/pythonProjects28/day19', 'os模块.py') 

# 获取结尾文件夹名
BASE_DIR = os.path.dirname(__file__)
FILE_PATH = os.path.abspath(__file__)

print(BASE_DIR)	# /Users/chenxu/Documents/pythonProjects28/day19
print(FILE_PATH)	# /Users/chenxu/Documents/pythonProjects28/day19/os模块.py
result = os.path.basename(BASE_DIR)
print(result)  # day19
result = os.path.basename(FILE_PATH)
print(result)  # os模块.py

# 判断当前路径是否是文件
BASE_DIR = /Users/chenxu/Documents/pythonProjects28/day19
FILE_PATH = /Users/chenxu/Documents/pythonProjects28/day19/os模块.py
print(os.path.isfile(BASE_DIR)) # False
print(os.path.isfile(FILE_PATH))	# True

# 判断当前路径是否是绝对路径
path_one = '/Users/chenxu/Documents/pythonProjects28/day19/os模块.py'
path_two = 'os模块.py'
print(os.path.isabs(path_one))  # True
print(os.path.isabs(path_two))  # False

# 判断当前文件夹路径是否存在或者是当前文件夹的父级文件夹是否存在
path_two = '/Users/chenxu/Documents/pythonProjects28/day19'
print(os.path.isdir(path_two))  # True
pat_one = '/Users/chenxu/Documents/pythonProjects28/day19/img'
pat_two = '/Users/chenxu/Documents/pythonProjects28/day19'

print(os.path.isdir(pat_one))  # True
print(os.path.isdir(pat_two))  # True

2.2 其他方法

# 创建单层文件夹
file_path = os.path.join(BASE_DIR, 'img')
# 创建文件夹
os.mkdir(file_path)


# 多层文件夹
file_path = os.path.join(BASE_DIR, 'img','girl')
# 创建多层文件夹
os.makedirs(file_path)

# 删除多级文件夹
# 若目录为空,则删除,并递归到上一级目录,
# 如若也为空,则删除,依此类推
file_path = os.path.join(BASE_DIR, 'img', 'girl')
os.removedirs(file_path) # OSError: [WinError 145] 目录不是空的。


# 删除单级文件夹(rmdir)
file_path = os.path.join(BASE_DIR, 'img', 'girl')
os.rmdir(file_path)

# 列出当前文件夹下的所有文件及文件夹(listdir)
print(os.listdir(BASE_DIR)) # ['os模块.py', 'random练习.py']

# 删除指定文件(remove)
file_path = os.path.join(BASE_DIR, 'img', 'girl', 'test.py')
os.remove(file_path)

# 删除指定文件夹 (非空文件夹和非空文件)
# listdir --》 拿到文件列表
file_path = os.path.join(BASE_DIR, 'img', 'girl')
file_list = os.listdir(file_path)
print(file_list)  # ['test.py', 'demo.py', '.idea']
for path in file_list:
    file_new_path = os.path.join(file_path, path)
    # print(file_new_path)
    if os.path.isfile(file_new_path):
        # /Users/chenxu/Documents/pythonProjects28/day19/img/girl/demo.py
        # /Users/chenxu/Documents/pythonProjects28/day19/img/girl/test.py
        os.remove(file_new_path)
    else:
        # /Users/chenxu/Documents/pythonProjects28/day19/img/girl/.idea
        os.rmdir(file_new_path)
# /Users/chenxu/Documents/pythonProjects28/day19/img/girl
os.rmdir(file_path)


3. json 模块

  • 将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化

3.1 序列化方法(loads)

  • 将json字符串转换为python对象
import json

json_str = '{"name":"serein","age":25}'
python_obj = json.loads(json_str)
print(python_obj, type(python_obj))
# {'name': 'serein', 'age': 25} <class 'dict'>

3.2 反序列化(dumps)

  • 将Python对象转换为json字符串
import json

json_dict = {"name":"serein","age":25}
python_obj = json.dumps(json_dict)
print(python_obj, type(python_obj))
# {"name": "serein", "age": 25} <class 'str'>

3.3 写入文件

import json

data = { "name": "serein", "age": 18}
with open("data.json", "w") as json_file:
    json.dump(python_obj, json_file)
    
    
    
# 指定参数编码(ensure_ascii)
import json

python_obj = {"name": "陈旭", "age": 25}
# 写文件时指定编码格式为 utf-8 ---> 这样在json文件中存储的中文才是正常的中文,否则是二进制数据
with open("data.json", "w",encoding='utf-8') as json_file:
    #  ensure_ascii=False 上面指定编码格式后需要将 默认使用 ascii 这个选项设置为否
    json.dump(python_obj, json_file,ensure_ascii=False)

4. hashlib

4.1摘要算法

  • Python的hashlib提供了常见的摘要算法
    • 如MD5
    • SHA1等等。
  • 摘要算法又称哈希算法、散列算法。
  • 它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)
import hashlib
#
# 原始字符串
old_data = 'hello world'

# 传进去的数据必须是二进制数据
# encode
old_data = old_data.encode('utf8')
md5 = hashlib.md5(old_data)
print(md5)  # <md5 _hashlib.HASH object @ 0x1009ae610>

# 返回的16进制数据 hexdigest()
result = md5.hexdigest()
print(result)  # 5eb63bbbe01eeed093cb22bb8f5acdc3
# 返回2进制的数据
resul_one = md5.digest()
print(resul_one)  # b'^\xb6;\xbb\xe0\x1e\xee\xd0\x93\xcb"\xbb\x8fZ\xcd\xc3'

登陆注册案例

import hashlib
import json


# 登陆注册
# 保存数据u
def save_data(path, data, mode='w', encoding='utf8'):
    with open(path, mode, encoding=encoding) as f:
        json.dump(data, f)

# 摘要算法方法
def encry_password(data):
    md5 = hashlib.md5(data.encode('utf8'))
    return md5.hexdigest()  # 十六进制的字符串


# 注册
def register():
    username = input("请输入用户名:").strip()
    password = input("请输入密码:").strip()
    password = encry_password(password)
    data = {'username': username, 'password': password}
    save_data(path='user_pwd.json', data=data)

# 读取数据
def read_data(path):
    with open(path, 'r', encoding='utf8')as f:
        data = json.load(f)
    return data

# 登陆
def login():
    username = input("请输入用户名:").strip()
    password = input("请输入密码:").strip()
    password = encry_password(password)
    path = 'user_pwd.json'
    data = read_data(path)
    print(data)
    print(password)
    if username in data.values():
        if password == data['password']:
            print('登陆成功')