• 7.5 字符表与文件操作


    一、字符编码。

      1.

      在计算机的运行中,有三大部分组成,计算机硬件,操作系统,应用程序,当使用者在使用文档编写文字时,所显示的所有字符都存储在内存中,随后再存储在硬盘里,(仅限文字),所以,当美国人发明电脑时,都是基于自己国家的文字编写的程序,所以,美国人发明了属于自己国家的字符表,也就是ASCLL码,,因为英文字母很少,加上一些特殊符号,阿拉伯数字等,ASCLL只有125位左右。一个字符码也就8bit。下面是数据的换算。

      8bit=1Bytes

      1024Bytes=1KB

      1024KB=1MB

      1024MB=1GB

      1024GB=1TB

      1024TB=1PB

      然而,美国人发明的电脑只能输入英文,中国的字是显示不出来的,于是,中国人需要自己写一个表让电脑看懂中国,于是GBK出现了,GBK最多有2**16=65535个字符,每一个字符站2B。

      既然中国人可以,那日本人,韩国人等都可以有,于是所有的国家根据自己的语言,编写了属于自己国家的字符码。

      当每个国家都想着有能识别自己国家的码时,万国码出现了(unicode),万国码几乎容纳了所有语言的编译与翻译,它同一使用2个Byte表示。

      至此为止,所有的表,在内存与硬盘中所都是一样的,然而万国码对cpu有这巨大的负担,原本1B的字符现在需要2B才能被存储,使用起来也相当麻烦。

      所有,人们想出了一个方法,在内存中使用unicode,而再存储的时候使用另一个编码——utf-8,unicode向utf-8转换时,会将英文字符变成一个B,而将中文字符变成3个B。

      总结。

      unicode两个特点.

      1。兼容万国字符

      2。与每一个国家的编码都有对应关系,

      从内存中的unicode二进制数据到硬盘中的utf-8的二进制数据称为编码(encode)

      从硬盘中的utf-8二进制数据到内存中unicode二进制数据被称为解码(decode)

      保证不乱码的核心点是:文本文件以什么类型的编码,就用什么类型的解码(*************)

      2.python2与python3的区别

      在python2 的编写是,unicode还没有盛行,所有python都已ASCLL进行编码,

      而在python3中,都使用utf-8进行编码。

      3.头文件定义字符的保存格式

      在文件的开头,可以使用以下代码定义文件的保存格式

    #coding:代码格式

      因为所有编码格式都支持英文字符,所以无论什么表都可以识别该代码。

      在python3中字符串默认是unicode,而在pycharm软件中,字符串默认为utf-8类型,在window终端编写程序时,使用的时GBK进行编码。

      在python3的终端中,字符串经过编码后所表现的时bytes类型的数据.

      在python2中定义中文字符串时,都会在前面添加‘u,吧字符串格式转换成Unicode’。

      (**********)

    x=""
    print(x.encode('utf-8'))
    #将字符串转换成utf-8的二进制类型
    print(res.decode('utf-8'))
    #将硬盘中的utf-8二进制数解码成unicode格式的二进制。

     二。文件

      1.什么是文件

      操作系统是提供给用户操作复杂硬件的简易接口。

      2.为什么要操作文件

      人或者应用程序需要永久保存数据。

      3.如何操作文件

      通过python代码操作文件。

       在python中,可以通过open来定义一个变量f,,后对文件进行操作,语法如下:

    f=open('D:Python项目day07a.txt',encoding='utf-8')

      其打印f后的结果是

    <_io.TextIOWrapper name='D:\python日常学习资料\7_5day07\代码\day07\a.txt' mode='r' encoding='utf-8'>

      可以看到是一个接口,所以f所获得的是对计算机硬件接口的操作。

      在定义文件名时,很容易出现 这种转义字符很容易出现文件读取错误,所以,在输入文件地址时通常会在字符前加r,意思就是取消转译。

    f = open(r'D:python日常学习资料7_5day07代码day07a.txt',encoding='utf-8')

      然而,window系统的默认读取文件的方式是gbk,在读取utf-8模式的字符串时,会报错,所以可以使用encoding参数指定文件读取的方式。

      文件使用结束后可以使用f.close(),函数,将文件操作关闭,但是在使用这种方法关闭后,后续如果再想对文件进行操作,会报错误,即io口操作错误,所以python有一个方便简洁的造作文件的方法,语法如下

    with open(r'D:python日常学习资料7_5day07代码day07a.txt',encoding='utf-8') as f ,
            open(r'D:python日常学习资料7_5day07代码day07.txt',encoding='utf-8') as f1:  # f仅仅是一个变量名 你把它看成是一个遥控器
            print(f)
            print(f1)

      也可以通过这种方法将多个文件介入操作。

      4.文件的处理模式

      文件有三种对文件的操作模式:

      r,只读模式

      w,只写模式

      a,追加模式

      文件有两种对文件单位的方式

      t,文本文件 以文本文件的形式操作文件

      b,二进制  以二进制的方式操作文件,注意再这个模式下encoding不可以指定参数。

      【r】其中mode指定的就是文件处理的模式R,W,A等,如果不指定,默认使用r只读模式,他,b不指定,默认指定t。

    with open(r'D:python日常学习资料7_5day07代码day07a.txt',mode='rt',encoding='utf-8') as f:
        print(f.readable())  # 是否可读
        print(f.writable())  # 是否可写
        print(f.read())  # 一次性将文件内容全部读出

      readable()输出的是文件是否可读,writable输出的是文件是否可写。read()可以将文件一次性读出,这种方式在读大型文件时,非常损耗进程,所以可以采用如下方式操作文件

    print(f.readlines()) 

      这中方式可以一行一行的读出文件,非常适合文件的操作。

      【w】

      只写模式切记要慎用,因为它在写文件时会将原来文件全部删除,再添加新的内容。

    with open(r'xxx.txt',mode='w',encoding='utf-8') as f:
        print(f.readable())  # 是否可读
        print(f.writable())  # 是否可写
        f.write('不不不,你没有翻~
    ')

      当文件xxx不存在时,会再该文件夹添加一个名为xxx的文件。

      只写模式也有多行操作,其使用列表进行操作,将列表的每个元素作为一行进行写入。使用writelines()

    with open(r'xxx.txt',mode='w',encoding='utf-8') as f:
        l = ['不sdffs,sdfs有翻~
    ','不sdfsdf不,你sdfsf翻~
    ','不sfad不,你没sa翻~
    ']
        f.writelines(l)

      【a】只追加模式

      在a模式中,可以在文件末尾添加内容,如果文件夹没有该文件,则会添加该文件后追加内容。

    with open(r'yyy.txt',mode='a',encoding='utf-8') as f:
        print(f.readable())  # 是否可读
        print(f.writable())  # 是否可写
        f.write('我是小尾巴
    ')

      当有该文件时,会将光标移到文件末尾。不清空原来的文件内容。

      【t】对文本文件的操作

      在t模式下,操作出的数据是字符串。

    with open('text1','rt',encoding='utf-8') as f:
        print(type(f.read(3)))
    #输出结果>>><class 'str'>

      需要对其进行字符串类型定义,一般使用utf-8,在写入数据时也需要使用文本类型。

    with open('text1','wt',encoding='utf-8') as f:
        f.write('我我我我我我')
    #输出结果>>>我我我我我我

      【b】二进制模式

      在这个模式下,encoding的值不需要被定义,而且读取文件时是以二进制的类型进行操作

    with open('text1','rb') as f:
        print(f.read())
        print(type(f.read()))
    #输出结果>>>b'xe6x88x91xe6x88x91xe6x88x91xe6x88x91xe6x88x91xe6x88x91'
    #<class 'bytes'>

      在写入数据时也是按照二进制写如,如果写入字符串类型会报错。

    with open('text1','wb') as f:
        f.write('我我我')
    #输出结果>>>报错

      所以,这里可以通过两种方法进行转换,1,使用encode()函数进行编码,将输入内容 编成二进制

    with open('text1','wb') as f:
        f.write('我我我'.encode())
    #输出结果>>>我我我

      2,使用bytes直接将字符串编码

    with open('text1','wb') as f:
        res='我我我'
        f.write(bytes(res,encoding='utf-8'))
    #输出结果>>>我我我

      在读取文件时也可以通过解码和转换字符串的方式

    with open('text1','rb') as f:
        res=f.readline()
        print(str(res,encoding='utf-8'))
        res2=f.readline()
        print((res2.decode('utf-8')))
    #输出结果>>>我我我wwwada
    #
    #你你你

      

    # coding:gbk
  • 相关阅读:
    前端基础(2)CSS
    前端基础(1)、HTML
    MySQL数据库,这一篇就够啦!!!(持续更新)
    十、数据库之流程控制
    九、数据库之存储过程和函数
    spring注解总结
    eclipse导入项目后错误的处理方式
    ssm分页查询错误
    字节编址和字的区别(转)
    数据库查询练习
  • 原文地址:https://www.cnblogs.com/LZXlzmmddtm/p/11140945.html
Copyright © 2020-2023  润新知