Day12 编码与文件的简单操作方法
文章目录
1、垃圾回收机制
- python会自动帮你申请和释放内存空间
1、引用计数
当引用计数不为0代表该数据值还在使用不会被删除,当数据值身上没有绑定变量时,引用计数为0,会被垃圾回收机制删除
name='jack' # 引用计数为1 name_1=namae # 引用计数加为2 del name_1 # 数据值jack 身上的引用计数归为1
2、循环引用 (特殊情况)
l1 = ['jack'] # 引用计数为1 l2 = ['tony'] # 引用计数为1 l1.append(l2) # 引用计数为2 l2.append(l1) # 引用计数为2 del l1 解绑 l1 del l2 解绑 l2 两个数据值之间还存在绑定 无法删除,引用计数还为1,无法被检测,要通过标记清除来删除
2、标记清楚
专门解除循环引用的问题, 将内存中程序产生的所有数据值全部检查一遍,是否存在循环引用,打上标记,之后一次性清楚
3、分代回收
将 数据值按使用频率进行三代分类(使用频率变低了那么将会调至低频率的阶层),对使用频率高的那么检测的间隔长,对使用频率低的那检测的时间间隔短。分类管理主要为了节省资源
2、字符编码
- 只有文本文件有字符编码的概念
- 计算内部纯存取数据的本质为二进制,只认识0和1
- 计算机的二进制语言与人类的语言有转换关系(翻译)
- 字符编码表,记录了人类与数字的对应关系。
2.1、字符编码发展史
- 一家独大
计算机是美国人发明的,所以最开始美国人先研究了计算机与人类字符的转换关系,美国人也只需要让计算机识别英文字符英文所有的字符加起来不超过2的七次方 127,但是美国人考虑后续可能出现新的字符所用了八位二进制 用2的八次方
ASCII码表 :记录了英文字符与数字的对应关系
A-Z 65-90 a-z 97-122
- 群雄割据
中国
需要计算年纪识别中文,开了一套中文的编码表
GBK码:内部记录了中文字符,英文字符与数字对应关系
2bytes 起步存储中文(遇到生僻字使用更多字节)
1bytes存储英文
韩国
需要计算机识别韩文,开发一套韩文的编码表
Euc——kr码:内部记录了韩文字符、英文字符,数字对应关系
日本
shift_Jis码:内部记录了日文字符,英文字符与数字对应关系
- 各国计算机无法直接交互,会出现乱码
- 天下一统
万国码(unicode):兼容万国字符
所有字符全部使用2bytes起步存储
utf家族(针对unicode的优化版本)>>>:utf8
英文还是采用1bytes
其他统一采用3bytes
- 内存采用unicode,硬盘使用utf8
3、编码与解码
- 只有字符串可以参与编码解码操作
解决乱码的措施就是当初以什么编码存就按什么编码取
编码 (人类字符编为计算机语言)
将人类的字符暗转指定编码器转换为计算机能读懂的数字
- 解码 (计算机语言解码为人类语言)
将计算机读懂的数字转换为人类能读懂的字符
3.1、解释器层面
python2默认编码为Ascii码
- 文件头需要加上 #coding:utf8
- 字符串前面要加u
python3默认编码是utf8码
4、文件操作
文件的操作:通过编写代码自动操作文件读写
什么是文件:双击图标是从硬盘加载数据到内存,文件图标是计算机系统给用户提供的快捷方式
保存文件:将内存中数据存到硬盘中
- 代码操作文件
open(文件路径,读写模式,字符编码)
方式1 f=open() f.clos() # 写完直接关闭节省资源空间 方式2 with open() as 变量名: 方式二于相比于方式一会自动调用close() !!!在书写文件路径时注意,可能存在字母撬棍的特殊组合含义, 在字符串前面加r取消。 建议直接将r写上保持习惯
作业
1.统计列表中每个数据值出现的次数并组织成字典战士
方法一:
l1 = ['jason', 'jason', 'kevin', 'oscar', 'kevin', 'tony', 'kevin']
dict_1 = {}
for i in l1:
if i not in dict_1:
dict_1[i] = 1
elif i in dict_1:
res = dict_1[i]
res += 1
dict_1[i] = res
print(dict_1)
>>>
{'jason': 2, 'kevin': 3, 'oscar': 1, 'tony': 1}
方法二:
l1 = ['jason', 'jason', 'kevin', 'oscar', 'kevin', 'tony', 'kevin']
dict_1 = {}
s1 = set(l1)
for i in s1:
dict_1[i]=l1.count(i)
print(dict_1)
>>>
{'tony': 1, 'kevin': 3, 'jason': 2, 'oscar': 1}
2.编写员工管理系统
1.添加员工信息
2.修改员工薪资
3.查看指定员工
4.查看所有员工
5.删除员工数据
user_dict = {'001': {'name': '测试', 'age': '22', 'job': '总裁', 'salary': '100'}, }
print('员工管理系统'.center(40, '*'))
# 系统大循环
while True:
item = input('1.添加员工信息\n2.修改员工薪资\n3.查看指定员工\n4.查看所有员工\n5.删除员工信息\n0.退出\n>>>')
# 信息录入
if item == '1':
print('信息录入'.center(40, '-'))
while True:
info_emp_dict = {} # 创建临时小字典
emp_id = input('请输入员工编号')
# 防止员工编号冲突,可以方便后续功能实现
if emp_id in user_dict:
print('员工编号已存在')
continue
user_dict[emp_id] = info_emp_dict
emp_name = input('请输入姓名:').strip()
info_emp_dict['name'] = emp_name
emp_age = input('请输入年龄:').strip()
info_emp_dict['age'] = emp_age
emp_job = input('请输入岗位:').strip()
info_emp_dict['job'] = emp_job
emp_salary = input('请输入薪资').strip()
info_emp_dict['salary'] = emp_salary
print(f'员工{emp_name}信息录入成功')
print(user_dict)
# 方便用户体验 防止输出跳转太快,
if input('按任意键继续录入,返回请输入0') == '0':
break
else:
continue
continue
# 修改薪资
elif item == '2':
print('薪资编辑'.center(40, '-'))
while True:
emp_id = input('请输入该员工id:')
if emp_id in user_dict:
info_emp_dict = user_dict[emp_id] # 取信息小字典
# 格式化输出 提升用户体验
salary_2 = input(f'原薪资为{info_emp_dict.get("salary")}k\n现要修改为>>>')
# 直接输入后 通过小字典键 修改值
info_emp_dict['salary'] = salary_2
print(f'修改成功,已将{info_emp_dict["name"]}薪资修改为{salary_2}k')
# 给个输入判断 增加用户体验
if input('按任意键继续修改,返回请输入0') == '0':
break
else:
continue
else:
print('员工编号不存在')
continue
# 查看员工信息
elif item == '3':
print('信息查询'.center(40, '-'))
while True:
emp_id = input('请输入该员工id:')
if emp_id in user_dict: # 通过编号取小字典
info_emp_dict = user_dict[emp_id]
print(f'姓名:{info_emp_dict.get("name")}\n年龄:{info_emp_dict.get("age")}\n'
f'岗位:{info_emp_dict.get("job")}\n薪资:{info_emp_dict.get("salary")}')
# 防止 输出完直接 开始下波循环
if input('返回请按0') == '0':
break
else:
print('员工编号不存在')
continue
# 查看所有员工
elif item == '4':
print('员工信息表'.center(40, '-'))
for i in user_dict: # 取编号
info_emp_dict = user_dict[i] # 取信息小字典
print(f'员工{info_emp_dict["name"]}信息'.center(30, '-'))
print(f'姓名:{info_emp_dict.get("name")}\n年龄:{info_emp_dict.get("age")}\n'
f'岗位:{info_emp_dict.get("job")}\n薪资:{info_emp_dict.get("salary")}')
# 与上同理
if input('返回请按0') == '0':
continue
# 删除员工星系
elif item == '5':
print('员工信息删除'.center(40, '-'))
while True:
emp_id = input('请输入该员工id:')
if emp_id in user_dict:
info_emp_dict = user_dict[emp_id] # 取信息小字典
print(f'姓名:{info_emp_dict.get("name")}\n年龄:{info_emp_dict.get("age")}\n'
f'岗位:{info_emp_dict.get("job")}\n薪资:{info_emp_dict.get("salary")}')
if input('确认删除请按任意键,返回请按0') != '0':
del info_emp_dict
print('删除成功')
break
else:
break
else:
print('员工编号不存在')
continue
# 退出系统
else:
print('退出成功')
break