今日内容概要
作业讲解
| 1.优化员工管理系统 |
| 拔高: 是否可以换成字典或者数据的嵌套使用完成更加完善的员工管理而不是简简单单的一个用户名(能写就写不会没有关系) |
| 员工的信息有:用户名 年龄 岗位 薪资... |
| 员工管理系统:注册、查看(单个员工、所有员工)、修改薪资、删除员工 |
| |
| user_data_dict = {} |
| while True: |
| print(''' |
| ----------员工系统--------- |
| 1.添加员工信息 |
| 2.查看单个员工信息 |
| 3.查看所有员工信息 |
| 4.修改员工薪资 |
| 5.删除员工信息 |
| ''') |
| |
| choice = input('请输入你想输入的数字指令>>>:').strip() |
| if choice == '1': |
| |
| while True: |
| new_id = input('你想添加的员工编号(x)>>>:').strip() |
| if new_id == 'x': |
| break |
| if not new_id.isdigit(): |
| print('员工编号必须是数字!') |
| continue |
| if new_id in user_data_dict: |
| print('用户已存在,请重新输入') |
| continue |
| |
| username = input('请输入员工的姓名').strip() |
| age = input('请输入员工的年龄:>>>').strip() |
| job = input('请输入员工的职业>>>:').strip() |
| salary = input('请输入员工的薪资>>>>:').strip() |
| |
| temp_dict = {} |
| |
| temp_dict['name_id'] = new_id |
| temp_dict['username'] = username |
| temp_dict['age'] = age |
| temp_dict['salary'] = salary |
| |
| user_data_dict[new_id] = temp_dict |
| |
| print(f'员工{username}添加成功') |
| |
| elif choice == '2': |
| while True: |
| target_id = input('你想添加的员工编号(x)>>>:').strip() |
| if target_id == 'x': |
| break |
| if not target_id.isdigit(): |
| print('员工编号必须是数字!') |
| continue |
| if target_id not in user_data_dict: |
| print('用户不存在,没法查看') |
| continue |
| |
| user_dict = user_data_dict.get(target_id) |
| |
| print(f""" |
| --------info of emp--------- |
| 编号:{user_dict.get('new_id')} |
| 姓名:{user_dict.get('username')} |
| 年龄:{user_dict.get('age')} |
| 工作:{user_dict.get('job')} |
| 薪资:{user_dict.get('salary')} |
| ----------------------------- |
| """) |
| |
| elif choice == '3': |
| for user_dict in user_data_dict.values(): |
| print(f""" |
| --------info of emp--------- |
| 编号:{user_dict.get('new_id')} |
| 姓名:{user_dict.get('username')} |
| 年龄:{user_dict.get('age')} |
| 工作:{user_dict.get('job')} |
| 薪资:{user_dict.get('salary')} |
| ----------------------------- |
| """) |
| |
| elif choice == '4': |
| while True: |
| |
| target_id = input('请输入您想要修改的员工编号(q)>>>:').strip() |
| if target_id == 'x': |
| break |
| if target_id not in user_data_dict: |
| print('员工编号不存在') |
| continue |
| |
| new_salary = input('请输入该员工的新薪资待遇>>>:').strip() |
| if not new_salary.isdigit(): |
| print('薪资只能是纯数字') |
| continue |
| |
| user_dict = user_data_dict.get(target_id) |
| |
| user_dict['salary'] = new_salary |
| |
| user_data_dict[target_id] = user_dict |
| print(user_data_dict.get(target_id)) |
| elif choice == '5': |
| while True: |
| |
| target_id = input('请输入您想要删除的员工编号(q)>>>:').strip() |
| if target_id == 'x': |
| break |
| if target_id not in user_data_dict: |
| print('员工编号不存在') |
| continue |
| |
| user_data_dict.pop(target_id) |
| |
| else: |
| print('没有此指令,请重新输入!') |
文件操作

| 1.文件的概念 |
| 就是操作系统暴露给用户操作硬盘的快捷方式 |
| |
| |
| 2.代码打开文件的两种方式 |
| 方式1: |
| f = open(文件路径,读写模式,encoding='utf8') |
| f.close() |
| 在python3下open函数可以通过encoding参数指定编码方式,而在2中不可以 |
| |
| |
| 方式2: |
| with open('a.txt','r', encoding='utf8') as f1: |
| with子代码块 |
| ps:with上下文管理好处在于子代码运行结束自动调用close方法关闭资源 |
| """ |
| open方法的第一个参数是文件路径 并且撬棍跟一些字母的组合会产生特殊的含义导致路径查找混乱 为了解决该问题可以在字符串的路径前面加字母r |
| D:\a\n\t |
| r'D:\a\n\t' |
| 以后涉及到路径的编写 推荐加上r |
| |
| with支持一次性打开多个文件 |
| with open() as f1,open() as f2,open() as f3: |
| 子代码 |
| """ |
| 使用with这种上下文环境的方式打开文件,在对文件操作完成后无需通过close()关闭文件,文件会自动关闭,而且安全系数更高。 |
文件读写模式
| 'r' 只读模式:只能读 不能编写 |
| |
| |
| with open(r'a.txt', 'r', encoding='uf8') as f: |
| print(f.read()) |
| |
| 'w' 只写模式:只能写不能看 |
| |
| |
| |
| |
| with open(r'a.txt', 'w', encoding='utf8') as f: |
| f.write('假期综合征 赶紧要调整\n') |
| f.write('假期综合征 赶紧要调整\n') |
| f.write('假期综合征 赶紧要调整\n') |
| '''强调:换行符需要自己添加 并且在后续数据读取比对的时候也一定要注意它的存在''' |
| |
| 'a' 只追加模式:在文件末尾添加数据 |
| |
| |
| |
| |
| with open(r'a.txt', 'a', encoding='utf8') as f: |
| f.write('寄') |
| """ |
| pass 用于填充空白 有些部分不知道怎么写的代码可以用pass |
| 只能补全语法不全的功能 本身没有任何含义 |
| """ |
文件操作模式
| t 文本模式 |
| 默认的模式 |
| 1.只能操作文本文件 |
| 2.读写都是以字符为单位 |
| 3.需要指定encoding参数 不知道则默认使用计算机默认编码 |
| |
| b 二进制模式(bytes模式) |
| 不是默认的模式 需要自己指定 |
| 1. 可以操作任意类型的文件 |
| 2. 读写都是以bytes为单位 |
| 3.不需要指定的encoding参数 因为它本身就是二进制模式了 不需要编码 |
| """二进制模式与文本模式针对文件路径是否存在的情况下 规律是一样的!!!""" |
文件的诸多操作方法
| 1.read() |
| |
| 并且当文件内容比较多的时候 该方法还可能会造成计算机内存溢出 |
| |
| 2.for循环 |
| 一行行读取内容,避免内存溢出现象 |
| 3.readline() |
| 一次只读一行内容 |
| 4.readlines() |
| 一次性读取所有内容 会按照行数组织成列表的一个个数据值 |
| 5.readable() |
| 判断文件是否具备读取能力 |
| |
| 6.wirte() |
| 写入数据 |
| 7.writeable() |
| 判断文件是否具备写数据的能力 |
| 8.writelines() |
| 接收一个列表 一次性将列表中所有的数据值写入 |
| 9.flush() |
| 将内存中文件数据立刻刷到硬盘 等价于ctrl + s |
文件内光标的移动
| with open(r'a.txt', 'rb') as f: |
| print(f.read()) |
| f.seek(0,0) |
| print(f.read()) |
| f.seek(0, 0) |
| print(f.read()) |
| |
| |
| |
| |
| seek(offset, whence) |
| offset是位移量 以字节为单位 |
| whence是模式 0 1 2 |
| 0是基于文件开头 |
| 文本和二进制模式都可以使用 |
| 1是基于当前位置 |
| 只有二进制模式可以使用 |
| 2是基于文件末尾 |
| 只有二进制模式可以使用 |
| |
作业
| 1.编写简易版本的拷贝工具 |
| 自己输入想要拷贝的数据路径 自己输入拷贝到哪个地方的目标路径 |
| 任何类型数据皆可拷贝 |
| |
| source_file_path = input('输入想要拷贝的数据路径').strip() |
| |
| target_file_path = input('你想要拷贝的地方>>>:').strip() |
| |
| with open(r'%s' % source_file_path, 'rb') as read_f, open(r'%s' % target_file_path, 'wb') as write_f: |
| for line in read_f: |
| write_f.write(line) |
| 2.利用文件充当数据库编写用户登录、注册功能 |
| 文件名称:userinfo.txt |
| 基础要求: |
| 用户注册功能>>>:文件内添加用户数据(用户名、密码等) |
| 用户登录功能>>>:读取文件内用户数据做校验 |
| ps:上述功能只需要实现一次就算过关(单用户) 文件内始终就一个用户信息 |
| 拔高要求: |
| 用户可以连续注册 |
| 用户可以多账号切换登录(多用户) 文件内有多个用户信息 |
| ps:思考多用户数据情况下如何组织文件内数据结构较为简单 |
| 提示:本质其实就是昨天作业的第二道题 只不过数据库由数据类型变成文件 |
| while True: |
| print(""" |
| 1.用户注册功能 |
| 2.用户登录功能 |
| """) |
| choice = input('请输入你想要的数字指令>>>:') |
| if choice == '1': |
| username = input('please input your name>>>:').strip() |
| password = input('please input your password>>>:').strip() |
| |
| with open(r'userinfo.txt', 'r', encoding='utf8') as f: |
| for line in f: |
| real_name, real_pwd = line.split('|') |
| if real_name == username: |
| print('用户名已经存在!') |
| break |
| else: |
| with open(r'userinfo.txt', 'a', encoding='utf8') as f1: |
| f1.write(f'{username}|{password}\n') |
| print(f'用户{username}添加成功') |
| elif choice == '2': |
| username = input('登录你的账户>>>:') |
| password = input('输入你的密码>>>:') |
| |
| with open(r'userinfo.txt', 'r', encoding='utf8') as f2: |
| for line in f2: |
| real_name, real_pwd = line.strip().split('|') |
| if real_name == username and real_pwd == password: |
| print('登陆成功') |
| break |
| else: |
| print('登陆失败') |
| else: |
| print('输入指令不存在...') |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)