今日内容概要
-
拔高作业讲解
-
文件操作
利用python代码的编写来读写文件 1. 文件的概念 2. 文件的操作方式 3. 文件读写模式 4. 文件操作模式 5. 文件诸多方法 6. 文件内容修改 7. 文件光标移动
内容详细
作业讲解
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
# 6.添加到大字典中
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
# 3.根据员工编号获取员工字典数据
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:
# 1.先获取想要修改的员工编号
target_id = input('请输入您想要修改的员工编号(q)>>>:').strip()
if target_id == 'x':
break
if target_id not in user_data_dict:
print('员工编号不存在')
continue
# 2.获取新的薪资
new_salary = input('请输入该员工的新薪资待遇>>>:').strip()
if not new_salary.isdigit():
print('薪资只能是纯数字')
continue
# 3.获取员工字典
user_dict = user_data_dict.get(target_id) # {'salary':123}
# 4.修改字典中的薪资
user_dict['salary'] = new_salary # {'salary': 321}
# 5.修改大字典
user_data_dict[target_id] = user_dict
print(user_data_dict.get(target_id))
elif choice == '5':
while True:
# 1.先获取想要修改的员工编号
target_id = input('请输入您想要删除的员工编号(q)>>>:').strip()
if target_id == 'x':
break
if target_id not in user_data_dict:
print('员工编号不存在')
continue
# 2.字典删除键值对
user_data_dict.pop(target_id)
else:
print('没有此指令,请重新输入!')
文件操作
1.文件的概念
就是操作系统暴露给用户操作硬盘的快捷方式
# 双击一个文件 其实是从硬盘将数据加载到内存
# ctrl+s保存文件 其实是将内存中的数据刷到硬盘保存
2.代码打开文件的两种方式
方式1:
f = open(文件路径,读写模式,encoding='utf8')
f.close()
在python3下open函数可以通过encoding参数指定编码方式,而在2中不可以
# 1、未指定文件编码格式,如果文件编码格式与当前默认的编码格式不一致,那么文件内容的读写将出现错误。
# 2、如果读写文件有错误,会导致文件无法正确关闭。因为哪怕在后面有 f.close()
方式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' 只读模式:只能读 不能编写
# 1.文件路径不存在:会直接报错
# 2.文件路径存在:正常读取文件内容
with open(r'a.txt', 'r', encoding='uf8') as f:
print(f.read())
'w' 只写模式:只能写不能看
# 1.文件路径不存在:自动创建
# with open(r'b.txt', 'w', encoding='utf8') as f:
# pass
# 2.文件路径存在:先清空文件内容 之后再写入
with open(r'a.txt', 'w', encoding='utf8') as f:
f.write('假期综合征 赶紧要调整\n')
f.write('假期综合征 赶紧要调整\n')
f.write('假期综合征 赶紧要调整\n')
'''强调:换行符需要自己添加 并且在后续数据读取比对的时候也一定要注意它的存在'''
'a' 只追加模式:在文件末尾添加数据
# 1.文件路径不存在:自动创建
# with open(r'c.txt', 'a', encoding='utf8') as f:
# pass
# 2.文件路径存在:自动在末尾等待追加内容
with open(r'a.txt', 'a', encoding='utf8') as f:
f.write('寄')
"""
pass 用于填充空白 有些部分不知道怎么写的代码可以用pass
只能补全语法不全的功能 本身没有任何含义
"""
文件操作模式
t 文本模式
默认的模式 # r w a其实全称是 rt wt at
1.只能操作文本文件
2.读写都是以字符为单位
3.需要指定encoding参数 不知道则默认使用计算机默认编码
b 二进制模式(bytes模式)
不是默认的模式 需要自己指定 # rb wb ab
1. 可以操作任意类型的文件
2. 读写都是以bytes为单位
3.不需要指定的encoding参数 因为它本身就是二进制模式了 不需要编码
"""二进制模式与文本模式针对文件路径是否存在的情况下 规律是一样的!!!"""
文件的诸多操作方法
1.read()
# 一次性读取所有内容 并且光标停留在尾部 继续读取则没有内容
并且当文件内容比较多的时候 该方法还可能会造成计算机内存溢出
# 括号内还可以填写数字 在文本模式下 表示读取几个字符
2.for循环
一行行读取内容,避免内存溢出现象
3.readline()
一次只读一行内容
4.readlines()
一次性读取所有内容 会按照行数组织成列表的一个个数据值
5.readable()
判断文件是否具备读取能力
# readable() 如果文件可读, 该方法返回True,否则返回False
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())
# print(f.read(2).decode('utf8')) 中文一个字 代码3个字节
# f.seek(-1, 2) 光标在末尾 -1 偏移数 向左移动1格
# print(f.tell()) # 返回光标距离文件开头产生的字节数
seek(offset, whence)
offset是位移量 以字节为单位
whence是模式 0 1 2
0是基于文件开头
文本和二进制模式都可以使用
1是基于当前位置
只有二进制模式可以使用
2是基于文件末尾
只有二进制模式可以使用
# print(f.read(3).decode('utf8')) 中文一个字 代码3个字节
作业
1.编写简易版本的拷贝工具
自己输入想要拷贝的数据路径 自己输入拷贝到哪个地方的目标路径
任何类型数据皆可拷贝
# 1.获取输入数据路径
source_file_path = input('输入想要拷贝的数据路径').strip()
# 2.获取目标文件的路径
target_file_path = input('你想要拷贝的地方>>>:').strip()
# 3.打开第一件文件的路径 读写内容写入到第二个文件路径中
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: # for循环读取每行内容
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()
#2.校验用户名是否已经存在
with open(r'userinfo.txt', 'r', encoding='utf8') as f: # 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('输入你的密码>>>:')
# 3.校验登录名是否正确
with open(r'userinfo.txt', 'r', encoding='utf8') as f2:
for line in f2: # 一行行对比内容
real_name, real_pwd = line.strip().split('|') # 去掉换行符 strip()
if real_name == username and real_pwd == password:
print('登陆成功')
break
else:
print('登陆失败')
else:
print('输入指令不存在...')
标签:文件,day9,读写,员工,诸多,dict,user,print,id
From: https://www.cnblogs.com/wei0919/p/16773015.html