欢迎光临
我们一直在努力

OS与OS.PATH的综合应用

1.使用os和os.path以及函数的递归完成:
给出一个路径,遍历当前路径所有的文件及文件夹
打印输出所有的文件(遇到文件输出路径,遇到文件夹继续进文件夹)

import os

def traverse_directory(path):
"""
递归遍历目录,打印所有文件的完整路径(不使用异常处理)
:param path: 要遍历的目录路径(需保证存在且有访问权限)
"""
# 获取目录中的所有条目
entries = os.listdir(path)

for entry in entries:
full_path = os.path.join(path, entry)
if os.path.isfile(full_path):
# 是文件则输出完整路径
print(full_path)
elif os.path.isdir(full_path):
# 是文件夹则递归进入
traverse_directory(full_path)

if __name__ == "__main__":
# 指定起始路径(这里以当前工作目录为例)
start_path = os.getcwd()
print(f"遍历目录: {start_path}\\n")
traverse_directory(start_path)

2.使用加密模块及IO模拟登录功能,要求使用文件模拟数据库存储用户名和密码。

import hashlib
import json
import os
import secrets
import getpass

class AuthSystem:
"""用户认证系统,使用JSON文件模拟数据库,密码采用PBKDF2哈希加密"""

def __init__(self, db_file='users.json'):
"""
初始化认证系统
:param db_file: 存储用户数据的文件名
"""
self.db_file = db_file
self.users = self._load_users()

def _load_users(self):
"""从文件加载用户数据,若文件不存在则返回空字典"""
if not os.path.exists(self.db_file):
return {}
try:
with open(self.db_file, 'r', encoding='utf-8') as f:
return json.load(f)
except (json.JSONDecodeError, IOError) as e:
print(f"读取数据库文件失败: {e},将使用空数据库")
return {}

def _save_users(self):
"""将用户数据保存到文件"""
try:
with open(self.db_file, 'w', encoding='utf-8') as f:
json.dump(self.users, f, indent=4, ensure_ascii=False)
except IOError as e:
print(f"保存数据库文件失败: {e}")

def _hash_password(self, password: str, salt: str, iterations: int = 100000) -> str:
"""
使用PBKDF2算法对密码进行哈希加密
:param password: 明文密码
:param salt: 十六进制字符串表示的盐值
:param iterations: 迭代次数,增加破解难度
:return: 哈希值的十六进制字符串
"""
# 将盐值从十六进制字符串转换为字节
salt_bytes = bytes.fromhex(salt)
# 生成密码哈希
hash_bytes = hashlib.pbkdf2_hmac(
'sha256',
password.encode('utf-8'),
salt_bytes,
iterations
)
return hash_bytes.hex()

def register(self, username: str, password: str) -> tuple:
"""
用户注册
:param username: 用户名
:param password: 密码
:return: (是否成功, 消息)
"""
if not username or not password:
return False, "用户名和密码不能为空"

if username in self.users:
return False, "用户名已存在"

# 生成随机盐值(16字节,转换为十六进制字符串)
salt = secrets.token_hex(16)
# 计算密码哈希
password_hash = self._hash_password(password, salt)

# 存储用户信息
self.users[username] = {
'salt': salt,
'hash': password_hash,
'iterations': 100000 # 存储迭代次数,便于未来升级
}
self._save_users()
return True, "注册成功"

def login(self, username: str, password: str) -> tuple:
"""
用户登录验证
:param username: 用户名
:param password: 密码
:return: (是否成功, 消息)
"""
if not username or not password:
return False, "用户名和密码不能为空"

if username not in self.users:
return False, "用户名不存在"

user_data = self.users[username]
salt = user_data['salt']
stored_hash = user_data['hash']
iterations = user_data.get('iterations', 100000) # 兼容旧数据

# 计算输入密码的哈希值
input_hash = self._hash_password(password, salt, iterations)

if input_hash == stored_hash:
return True, "登录成功"
else:
return False, "密码错误"

def main():
"""主函数,提供命令行交互界面"""
auth = AuthSystem()
print("=== 用户认证系统(文件数据库 + 加密存储)===")

while True:
print("\\n请选择操作:")
print("1. 注册")
print("2. 登录")
print("3. 退出")

choice = input("请输入选项(1-3):").strip()

if choice == '1':
print("\\n— 用户注册 —")
username = input("用户名:").strip()
password = getpass.getpass("密码:").strip()
confirm = getpass.getpass("确认密码:").strip()

if password != confirm:
print("两次输入的密码不一致,注册失败")
continue

success, msg = auth.register(username, password)
print(msg)

elif choice == '2':
print("\\n— 用户登录 —")
username = input("用户名:").strip()
password = getpass.getpass("密码:").strip()

success, msg = auth.login(username, password)
print(msg)

elif choice == '3':
print("感谢使用,再见!")
break
else:
print("无效选项,请重新输入")

if __name__ == "__main__":
main()

赞(0)
未经允许不得转载:171主机测评 » OS与OS.PATH的综合应用
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址