Day09课后有感

今日内容概要

  • 字符编码简介

  • 字符编码发展史(理论)

  • 字符编码实战应用

  • 文件操作简介

  • 大作业讲解

  • 字符编码的实际应用

  • 文件操作简介

  • 文件的读写模式

  • 文件的操作模式

  • 文件的操作方法

  • 文件补充说明

  • 利用文件充当数据库完成用户注册登录

 

字符编码简介

字符串类型、文本文件的内容都是由字符组成的,但凡涉及到字符的存取,都需要考虑字符编码的问题。

字符编码主要研究的对象是文本文件(图片、视频、音频除外)

  

文本编辑器读取文件内容的流程

#阶段1、启动一个文件编辑器(文本编辑器如nodepad++,pycharm,word)

#阶段2、文件编辑器会将文件内容从硬盘读入内存

#阶段3、文本编辑器会将刚刚读入内存中的内容显示到屏幕上

  

python解释器执行文件的流程

#阶段1、启动python解释器,此时就相当于启动了一个文本编辑器

#阶段2、python解释器相当于文本编辑器,从硬盘上将test.py的内容读入到内存中

#阶段3、python解释器解释执行刚刚读入的内存的内容,开始识别python语法 

字符编码的发展史

# 字符编码表:内部就是存储了数字与人类字符的对应关系
1.一家独大
	计算机是由美国人发明的	如何让计算机认识英文
    	定义一个数字与英文字符的对应关系>>>:字符编码表
            ASCII码:只记录了英文字符与数字的对应关系
                1bytes存储英文字符
                	"""
                	A-Z:65-90
                	a-z:97-122
                	"""
2.群雄割据
	中国人
    	自己发明一套编码表>>>:数字与中文、英文字符的对应关系
            GBK码:记录了英文、中文与数字的对应关系
                1bytes存储英文字符
                2bytes存储中文字符 如果不够则使用3bytes\4bytes
                	"""
                	以前很多生僻字打不出来 现在却可以了
                		原因就在于GBK里面在不断地更新 添加对应关系
                	"""
    韩国人
    	韩国棒子也发明了他们的编码表>>>:数字与韩文、英文字符对应的关系
            Euc_kr:记录了英文、韩文与数字的对应关系
    日本人
		小日本也发明了他们的编码表>>>:数字与日文、英文字符对应的关系
            shift_JIS:记录了英文、日文与数字的对应关系
    ...
    """
    	群雄割据的阶段会产生一个非常奇怪的现象>>>:乱码
    	其实就是编码本使用混乱导致文本展示错误
    """
3.天下一统
	unicode  # 万国码
    """内部记录了所有国家的字符与数字的对应关系"""
    	所有的字符统一采用最少2bytes存储
    
    现在的计算机可以输出所有国家的字符 内存使用的是unicode编码
    unicode会浪费存储空间和IO时间 所以又开发了一个编码
    utf8  # unicode transformation format 
    	优化了unicode存储数据的容量
        	1bytes存储英文字符
            3bytes存储中文字符
# 结论:内存中的编码不需要考虑 只考虑硬盘上的即可  utf8

 

 大作业讲解(容我先糊上,再抄它个几遍好好理解)

"""
# 1.定义一个存储用户数据的字典
user_data_dict = {}
"""
{'员工编号':{员工数据}, '员工编号':{员工数据}, '员工编号':{员工数据}}
"""
# 2.循环打印系统功能
while True:
    print("""
    1.添加员工信息
    2.修改员工薪资
    3.查看指定员工
    4.查看所有员工
    5.删除员工数据
    """)
    # 3.获取用户想要执行的功能编号
    choice = input('请输入您想要执行的功能编号>>>:').strip()
    # 4.判断用户想要执行的功能
    if choice == '1':
        # pass  # TODO:补全语法 但是本身没有任何功能
        # 1.先获取员工编号
        emp_id = input('请输入新员工的编号>>>:').strip()
        # 2.判断员工编号是否已存在 如果存在则提示重复 不存在则正常往下执行
        if emp_id in user_data_dict:
            print('员工编号已存在 无法添加')
            continue  # 3.存在 则直接结束本次循环
        # 4.正常获取员工的其他数据
        emp_name = input('请输入员工的姓名>>>:').strip()
        emp_age = input('请输入员工的年龄>>>:').strip()
        emp_salary = input('请输入员工的薪资>>>:').strip()
        # 5.临时构建一个用户小字典
        user_dict = {'emp_id': emp_id, 'emp_name': emp_name, 'emp_age': emp_age, 'emp_salary': emp_salary}
        # 6.将数据添加到大字典中
        user_data_dict[emp_id] = user_dict  # 键不存在则新增键值对
        # 7.打印提示信息
        print(f'员工{emp_name}添加成功')
    elif choice == '2':
        # 1.先获取想要修改薪资的员工编号
        target_id = input('请输入您想要修改的员工编号>>>:').strip()
        # 2.判断当前编号是否存在
        if target_id not in user_data_dict:
            print('员工编号不存在 无法修改')
            continue  # 3.存在 则直接结束本次循环
        # 4.获取对应员工的字典
        user_dict = user_data_dict.get(target_id)
        # 5.获取新的薪资
        new_salary = input('请输入该员工新的薪资待遇>>>:').strip()
        # 6.修改员工字典数据
        user_dict['emp_salary'] = new_salary
        # 7.修改大字典数据
        user_data_dict[target_id] = user_dict
        # 8.提示信息
        print(f'编号为{target_id}的员工薪资成功修改为{new_salary}')
    elif choice == '3':
        # 1.获取员工编号
        target_id = input('请输入您想要查看的员工编号>>>:').strip()
        # 2.判断当前编号是否存在
        if target_id not in user_data_dict:
            print('员工编号不存在 无法查看')
            continue  # 3.存在 则直接结束本次循环
        # 4.直接获取对应的员工数据字典
        user_dict = user_data_dict.get(target_id)
        # 5.打印员工数据
        print("""
                    ------------emp info------------
                    员工编号:%s
                    员工姓名:%s
                    员工年龄:%s
                    员工薪资:%s
                    ---------------end--------------
                    """ % tuple(user_dict.values()))  # %(1,2,3,4)  简便写法
    elif choice == '4':
        for user_dict in user_data_dict.values():  # {} {} {}
            print("""
            ------------emp info------------
            员工编号:%s
            员工姓名:%s
            员工年龄:%s
            员工薪资:%s
            ---------------end--------------
            """ % tuple(user_dict.values()))  # %(1,2,3,4)  简便写法
            # print("""
            #             ------------emp info------------
            #             员工编号:%s
            #             员工姓名:%s
            #             员工年龄:%s
            #             员工薪资:%s
            #             ---------------end--------------
            #             """ % (user_dict.get('emp_id'), user_dict.get('emp_name'), user_dict.get('emp_age'),
            #                    user_dict.get('emp_salary')))  # %(1,2,3,4)
    elif choice == '5':
        # 1.获取想要删除的员工编号
        delete_id = input('请输入您想要删除的员工编号>>>:').strip()
        # 2.判断当前编号是否存在
        if delete_id not in user_data_dict:
            print('员工编号不存在 无法删除')
            continue  # 3.存在 则直接结束本次循环
        # 3.根据字典的key删除数据
        res = user_data_dict.pop(delete_id)
        # 4.提示
        print(f'员工信息删除完毕',res)
    else:
        print('请输入正确的功能编号')

  

 

 

 

字符编码实际应用

1.编码与解码

  编码 encode

   将人类能够读懂的字符编码成计算机能够直接读懂的字符

举个🌰

  s1 = '事已至此 何不一搏'

    print(s1.encode('gbk'))  # 用gdk编码语言编写计算机能直接读懂的语言来翻译s1
  """
  字符串前面如果加了字母b 表示该数据类型为 bytes类型
  bytes类型可以看成是二进制(01010101010)
  """

     解码  decode 

  res = b'\xca\xc2\xd2\xd1\xd6\xc1\xb4\xcb \xba\xce\xb2\xbb\xd2\xbb\xb2\xab'。
    print(res.decode('gbk'))  # 将gbk语言的代码翻译成人类能听懂的语言

  

  """
  基于网络传输数据 数据都必须是二进制格式
  所以肯定涉及到编码与解码
  """

 

2.如何解决乱码的问题

  出现乱码是因为编码与解码的语言不同,所以数据当初以什么编码编的就以什么编码解即可

 

3.python解释器层面


  python2解释器默认的编码是ASCII码,ASCII码无法识别中文,那么需要运用到文件头


   1.文件头:

    告诉解释器使用指定的编码,所以要写文件头,文件头:必须写在文件的最上方  (python2)

    这样敲:
      coding:utf8 
      -*- coding:utf8 -*- (这是美化写法)


   2.字符前缀:

    在使用python2解释器的环境下定义字符串习惯在前面加u

    这样敲:
      name = u'你好啊'


      """

       python3解释器默认的编码是utf8,就不需要以上两种方式

      """

 

文件操作简介

什么是文件?
  操作系统显示给用户可以直接操作硬盘的快捷方式 代码操作文件的流程(和鼠标操作方式一致)
  1.打开文件、创建文件 2.编辑文件内容 3.保存文件内容 4.关闭文件 基本语法结构 结构1(了解即可):           f1 = open() #python指令一般沿用英文单词            f1.close() 结构2(推荐使用):           with open() as f:         pass

1.使用关键字打开文件


  '''以后写路径为了防止特殊符号 直接加r'''
    open(r'a.txt') # 相对路径
    open(r'D:\py1\day09\a.txt') # 绝对路径  # 文件的路径是必须要写的
    res = open(r'a.txt', 'r', encoding='utf8')  #  open(文件的路径,文件的操作模式,文件的编码)    文件的操作模式、文件的编码有时候不用写
    print(res.read()) # 读取文件内容
    res.close() # 关闭文件

  """上述操作open完最后都需要执行close 而close这一行很任意被遗忘"""
    with上下文管理
    with open(r'a.txt', 'r', encoding='utf8') as f: # f = open()
    data = f.read()
    print(data)

  

 

文件的读写模式

r(read)	只读模式:只能读不能写
w(write)	只写模式:只能写不能读
a(append)只追加模式:在文件末尾添加内容
  
r模式:
路径不存在:直接报错
这样敲:   with open(r'b.txt', 'r', encoding='utf8') as f1:     pass 路径存在:正常打开文件并等待内容读取  
  open(r'a.txt', 'r', encoding='utf8') as f1:   print(f1.read()) # 一次性读取文件内所有的内容   f1.write('python是最牛逼的语言!!!') # 报错
  """     able在英语中大部分情况下表示的是 具备...的能力    readable 具备读的能力    writable 具备写的能力    ...
  """ 补全语法的两种方式:
pass (推荐)补全语法结构 本身没有任何功能 ... (不推荐)补全语法结构 本身没有任何功能
w模式:
路径不存在:自动创建文件

这样敲: with open(r'b.txt', 'w', encoding='utf8') as f1: pass 路径存在:先清空文件内容 之后再写入数据 with open(r'a.txt', 'w', encoding='utf8') as f1: f1.write('你们是我见过的最优秀一批学生1\n') # 写入文件内容 f1.write('你们是我见过的最优秀一批学生2\r') # 写入文件内容 f1.write('你们是我见过的最优秀一批学生3\n') # 写入文件内容 print(f1.read())
""" 换行 最早的时候:\r\n 为了节省空间支持一个字符 根据操作系统的不同可能有所区别 \n 、 \r """ a模式:
  路径不存在:自动创建文件

这样敲:   with open(r'c.txt', 'a', encoding='utf8') as f1: pass   路径存在:不会清空文件内容 而是在文件末尾等待新内容的添加   with open(r'a.txt', 'a', encoding='utf8') as f1:     f1.write('哈哈哈哈或或或或或')     print(f1.read())

  

文件的操作模式

t模式		
	文本模式 是默认的模式
    	r	rt
        w	wt
        a	at
    1.该模式只能操作文本文件
    2.该模式必须要指定encoding参数  # 编码参数
    3.该模式读写都是以字符串为最小单位
	
b模式    
	二进制模式  可以操作任意类型的文件
    	rb  不能省略b
        wb  不能省略b
        ab  不能省略b
    1.该模式可以操作任意类型的文件
    2.该模式不需要指定encoding参数  # 编码参数
    3.该模式读写都是以bytes类型为最小单位

  

文件内置方法

read()  # 一次性读取文件内容
1.执行完之后光标在文件末尾 继续读取没有内容 2.当文件内容特别大的时候 容易造成内存溢出(满了) readline() # 一次只读一行内容 readlines() # 结果是一个列表 里面的各个元素是文件的一行行内容 readable() # 判断当前文件是否可读 支持for循环 # 一行行读取文件内容(推荐使用) 内存中同一时刻只会有一行内容 write() # 写入文件内容(字符串或者bytes类型) writelines() # 可以将列表中多个元素写入文件 writable() # 判断文件是否可写 flush() # 相当于主动按了ctrl+s(保存)

 

作业

练习周末大作业
1.编写一个简易版本的拷贝程序
	路径全部自定义
2.结合文件编写用户注册登录功能
	# 提前先创建一个空的userinfo.txt
	用户注册 数据保存到文件中
    用户登录 数据来源于文件
    1.必须给我写出来
    	单用户注册登录
    2.拔高练习
    	多用户注册登录
3.整理今日内容及博客、录音等

  

posted @ 2022-03-16 22:02  ji哩咕噜  阅读(34)  评论(0)    收藏  举报