python全栈开发day07字符编码、文件处理

储备知识点:

  • 计算机系统分为三层:
    应用程序
    操作系统
    计算机硬件
  • 运行python程序的三个步骤
    • 1.先启动python解释器
    • 2.再将python文件当作普通文本文件读入内存
    • 3.解释执行读入内存的代码,开始识别语法

1.字符编码

  • 什么是字符编码
    • 字符编码表:人类的字符<---------------------->数字(二进制)
      硬盘存文件是用二进制存的,我们写文件用的又是我们自己的语言所以有了这个需求

这里有一个二进制位的概念:
8bit(一个二进制位)=1Bytes(可以简称1B)

    • ASCII码:只能识别英文字符(大概100多个字符,为了能用二进制区分,我们用8个二进制位表示一个英文字符),

      1英文字符=8bit   (用8个二进制位表示一个英文字符)
      
    • GBK码(当计算机不再只在美国被使用时,传入中国,就有识别汉字字符的需求):能识别汉字字符和英文字符

      1个汉字字符=16bit(汉字毕竟比较多,中华文化博大精深,需要更多的二进制位区分了)
      1个英文字符=8bit(区分方法和ASCII码的形同) 
      
    • Shift_JIS码(它也传到日本了,有了需求)
    • Euc-kr码(又到韩国,又有了需求)

这里有一个问题,如果一个中国人写了一个很NB的程序,美国人想用,日本人也想用,把我们的程序存到他们国的计算机硬盘中,存都是二进制没有问题,可是当他们要运行程序,要都文件的时候,比如是美国人,他们计算机是用ASCII码读的,他们的ASCII码表中没有汉字字符,他们读出来的就是乱码。程序或者文本读出也没打用,根据这个需求

    • unicode码:能识别万国字符(用的起电脑的国家的字符)

      1个字符(每种字符)=2Bytes=16bit
      

      两大特点:

      • 1.能兼容万国字符
      • 2.与各个国家的字符编码都有映射关系
    • utf-8:是unicode的转换格式(和unicode相比储存更节省空间)

      1个英文字符=1Bytes , 1个汉字字符=3Bytes
      

这里穿插一个对字符编码的想法:首先为什么unicode要有和各个国家的字符编码有映射关系,为什么么不直接用笔unicode更省储存空间的utf-8?

当有可兼容万国字符的unicode时,之前的程序\文本文件都是各国用自己国家的字符编码做的,不可能直接用unicode是不能解码的,不能之前写的程序都不用了,需要有一个平缓的过渡,所以unicode需要有和各国的字符编码有映射关系,可以转换。
utf-8他是没有直接对应的字符的,它是直接和unicode有一个映射关系,当我们过渡完了,所以的所有软件都是utf-8的方式储存的时候,unicode包括各国的字符编码表都会退出历史舞台。

  • 重点理论
    • 1.编码与解码

      字符---编码-->unicode的二进制-------编码----->GBK的二进制
      
      GBK的二进制-----解码-->unicode的二进制----解码->字符
      
    • 2.决乱码问题的核心法则:

      字符用什么编码格式编码的,就应该用什么编码格式进行解码
      
    • 3.python解释器默认的字符编码

      python2:ASCII
      python3:UTF-8
      
      通过文件头可以修改python解释器默认使用的字符编码
      在文件首行写:#coding:文件当初存的时候用的字符编码
      
    • 针对python2解释器中定义字符串应该:

      x=u"上"
      对于python3解释即便是x="上"不加u前缀也是存成unicode
      
    • 在python3中

      x='上' #'上'存成了uncidoe
      
    • unicode--------encode----------->gbk

      res=x.encode('gbk') #res是gbk格式的二进制,称之为bytes类型
      
    • gbk(bytes类型)-------decode---------->unicode

      y=res.decode('gbk') #y就是unicode
      

2 .为何字符要编码

  • 人类与计算机打交道用的都是人类的字符,而计算机无法识别人类的字符,只能识别二进制,所以必须将人类的字符编码成计算机能识别的二进制数字.

2.文件处理

  • 1 什么是文件

文件是操作系统提供给用户/应用程序的一种虚拟单位,该虚拟单位直接映射的是硬盘空间

  • 2 为何要处理文件

用户/应用程序直接操作文件(读/写)就被操作系统转换成具体的硬盘操作,从而实现
用户/应用程序将内存中的数据永久保存到硬盘中

  • 3 如何用文件
    • 文件处理的三个步骤:
f = open(r'c.txt',mode = 'r',encoding = 'utf-8')     # 文件对象(应用程序的内存资源)------》操作系统打开的文件(操作系统的内存资源)
print(f)         #f变量为打开c.txt文件,读文件,utf-8解码
data=f.read()     #定义一个变量,变量值是读到的文件文本read方法返回值为读到的文本字符
print(data)
f.close() # 向操作系统发送信号,让操作系统关闭打开的文件,从而回收操作系统的资源

# 上下文管理
with open(r'c.txt',mode='r',encoding='utf-8') as f,open(r'b.txt',mode='r',encoding='utf-8') as f1:         
     # 读写文件的操作
     pass
#这个方法是防止忘记让操作系统关闭打开的文件,当操作完成后会自动关掉打开的文件
    • 文件的打开模式:r(默认的) w a
    • 操作文件内容的模式:

      1.t(默认的):操作文件内容都是以字符串为单位,会自动帮我们解码,必须指定encoding参数
      2.b: 操作文件内容都是以Bytes(二进制)为单位,硬盘中存的时什么就取出什么,一定不能指定encoding参数
      总结:t模式只能用于文件本文件,而b模式可以用于任意文件
      
    • r模式:只读模式,在文件不存在时则报错,如果文件存在文件指针跳到文件的开头
with open(r'c.txt',mode='rt',encoding='utf-8') as f:      #操作文件内容都是以字符串为单位,会自动帮我们解码
    print(f.read())      #读文件操作
    print(f.readable())     #判断文件是否可读
    print(f.writable())f.write('hello') # 只能读,报错
    
    data=f.read()   
    print(data,type(data))   #读的操作,读出来的是str类型


with open(r'c.txt',mode='rb') as f:      #存的什么样,就取出什么样
    data=f.read()      
    print(data,type(data))      #输出二进制类型,type:bytes
    res=data.decode('utf-8')      #用utf-8解码
    print(res)

with open(r'c.txt',mode='rt',encoding='utf-8') as f:
    line=f.readline()       #readline只读一行,当碰到换行符时停止
    print(line,end='')            #print中默认end=‘\n’换行,我们让它不换行
    line1=f.readline()
    print(line1,end='')
    line2 = f.readline()
    print(line2,end='')

    lines=f.readlines()     #readlines以列表的形式全部读
    print(lines)

#read方法直接全读,如果文件太大,直接全部读入内存,内存会炸,readlines方法一样

#当我们有全读大文件的需求时
#可以空循环读文件内容的方法:
with open(r'c.txt',mode='rt',encoding='utf-8') as f:
    for line in f:
        print(line,end='')
#用for循环一行一行读

'''
总结:
    read方法和readlines方法的局性:
        都只能读小文件
'''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值