Day12 编码与文件的简单操作方法

本文介绍了Python中的垃圾回收机制,包括引用计数和标记清除,以及字符编码的发展历程,重点讲解了ASCII、GBK、EUC-KR和Unicode编码。此外,涵盖了编码解码原理和文件操作的基本操作,如统计字符出现次数和员工管理系统实例。
摘要由CSDN通过智能技术生成

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、字符编码

  1. 只有文本文件有字符编码的概念
  2. 计算内部纯存取数据的本质为二进制,只认识0和1
  3. 计算机的二进制语言与人类的语言有转换关系(翻译)
  4. 字符编码表,记录了人类与数字的对应关系。

2.1、字符编码发展史

  1. 一家独大
    计算机是美国人发明的,所以最开始美国人先研究了计算机与人类字符的转换关系,美国人也只需要让计算机识别英文字符

英文所有的字符加起来不超过2的七次方 127,但是美国人考虑后续可能出现新的字符所用了八位二进制 用2的八次方

​ ASCII码表 :记录了英文字符与数字的对应关系
​ A-Z 65-90

​ a-z 97-122

  1. 群雄割据

中国

​ 需要计算年纪识别中文,开了一套中文的编码表

​ GBK码:内部记录了中文字符,英文字符与数字对应关系

​ 2bytes 起步存储中文(遇到生僻字使用更多字节)

​ 1bytes存储英文

韩国

​ 需要计算机识别韩文,开发一套韩文的编码表

​ Euc——kr码:内部记录了韩文字符、英文字符,数字对应关系

日本

​ shift_Jis码:内部记录了日文字符,英文字符与数字对应关系

  • 各国计算机无法直接交互,会出现乱码
  1. 天下一统

万国码(unicode):兼容万国字符

​ 所有字符全部使用2bytes起步存储

utf家族(针对unicode的优化版本)>>>:utf8

​ 英文还是采用1bytes

​ 其他统一采用3bytes

  • 内存采用unicode,硬盘使用utf8

3、编码与解码

  • 只有字符串可以参与编码解码操作
  1. 解决乱码的措施就是当初以什么编码存就按什么编码取

  2. 编码 (人类字符编为计算机语言)

​ 将人类的字符暗转指定编码器转换为计算机能读懂的数字

  1. 解码 (计算机语言解码为人类语言)

​ 将计算机读懂的数字转换为人类能读懂的字符

3.1、解释器层面

python2默认编码为Ascii码

  1. 文件头需要加上 #coding:utf8
  2. 字符串前面要加u

python3默认编码是utf8码

4、文件操作

文件的操作:通过编写代码自动操作文件读写

什么是文件:双击图标是从硬盘加载数据到内存,文件图标是计算机系统给用户提供的快捷方式
保存文件:将内存中数据存到硬盘中

  1. 代码操作文件

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值