zoukankan      html  css  js  c++  java
  • 字符编码,文件处理

    软件启动的流程
    打开notepad++ 来查看test.txt文档
    1.从硬盘将软件程序加载到内存中
    2.加载test.txt到内存中
    3.执行notepad的代码将test.txt的内容输出到屏幕上

    python解释器也是一个应用软件
    1.从硬盘将解释器加载到内存中
    2.加载test.py到内存中
    3.解释器解析python语法



    文本编辑器与解释器在打开同一个py文件时
    前两个阶段是一致的,仅仅是第三个阶段不同


    什么是字符编码?字符编码表
    编码,按照某种规范 将数据转换为二进制
    为什么要编码?
    计算机只能识别0/1,那么要使用计算机则必须将所有的数据和命令都用二进制表示
    这是一个复杂的过程,所以需要一种解决方案,可以让计算机识别人类的语言

    字符编码的发展史
    美国人发明了计算机,需要让计算机识别美国人的语言,所以诞生了asc编码表
    其他的国家也需要使用计算机,于是每个国家都推出了自己的编码表
    中国-GBK
    日本-shift-j
    因为每个编码表互不兼容,导致乱码问题
    为了统一全世界的编码 推出而unicode编码
    1.统一全世界的编码
    2.必须还兼容之前的GBK,shift-j

    ASCII 中用八个二进制(1个bytes)一个字符占一个字节

    GBK 英文字母占一个字节
    中文占两个字节
    16个二进制 2**16-1=65535
    如果一个字节的首位为1 表示一个中文
    若果一个字节的首位为0 表示一个英文
    GBK不仅仅要存储数据 还要计算每一个符号占的长度

    unicode 无论英文还是其他字符 都是2个字节
    为什么这么设计?不浪费空间?
    1.为了提高效率,而采取的空间换时间(效率)
    unicode的问题
    浪费空间,降低网络传输效率

    为了解决上述unicode的问题、:推出了UTF-8
    utf-8是变长的
    英文占一个字节
    中文占三个字节
    生僻字占更多字节

    与GBK相同的是,都需要计算,所以不适用于内存
    适用于:硬盘和网络传输
    utf-8 使用场景
    1.当我们需要将数据基于网络进行发送时则必须将数据转成二进制
    2.当你需要将数据从内存写到硬盘也推荐使用UTF-8

    结论就是 内存中用unicode,硬盘或网络中用UTF-8

    用户输入->内存(unicode)->转换成(utf-8)->硬盘 该过程称之为编码 就是字符转为二进制的过程
    硬盘上的a.txt(utf-8的二进制)-> 内存中unicode的二进制—>查编码表得到符号->显示到屏幕上
    该过程称之为解码 把二进制转为符号

    乱码问题?*******
    1.存储时与取出时使用的编码方式不一致
    2.乱码不仅仅是因为存和取的编码不同,还可能是存的时候就已经乱了,这将导致数据流失!
    所以存的时候一定要注意:
    所使用的编码方式一定要支持文档中的所有内容,即utf-8

    python在执行代码之前必须从硬盘加载代码到内存,而硬盘中都是二进制数据,必须先解码为unicode
    那解释器怎么知道拟采用的什么编码方式?
    如果不明确自定 解释器将采用默认的解码方式,在python3中默认为utf-8而python2中默认为ASC
    当你使用的是py2的时候 则需要手动制定编码方式,在文档的第一行写上 coding:uft-8
    coding:uft-8

    解释器在读取py文件后需要识别语法 当定义字符串编码时又涉及到编码问题
    py2默认采用asc 也可以使用coding来指定 但也有乱码的可能
    当coding为gbk 而输出字符时采用utf-8
    py3中默认就是unicode 别切coding也只能修改前两阶段解码过程,无法修改定义变量的编码

    py2中当从内存访问变量时可能会乱码,例如存储时utf-8的字符但是输出时 却用了GBK
    python2中u 表示 将这个变量存储为unicode编码 可以防止取出变量时乱码
    数据类型也变为了unicode
    1个16进制 = 0.5个字节
    *****
    encode: unicode->uft-8 将unicode的字符 转为自定的二进制
    decode: utf-8 ->unicode 将二进制转为unicode

    encode使用场景*****
    1.需要文本写入到硬盘
    2.需要将将文本基于网络发送时

    文件处理:

    文件是什么?
    文件是操作系统提供的一套虚拟概念
    文件这个概念之所以出现 是为了简化对硬盘的操作
    一个文件就代表硬盘上的一段二进制数据

    学习文件处理是为了将数据永久保存

    打开文件的语法1
    1.打开文件
    f=open('test.txt',encoding='utf-8')#是给系统发送了一个指令,让操作系统去打开文件,因为应用程序无法直接控制硬件

    2.读取内容
    data=f.read()
    print(data)

    3.关闭文件 不要忘记关闭
    f.close()

    open close read等都是在给操作系统发送指令

    打开文件的语法2: 在with代码执行完毕后会自动调用close
    with open ('test.txt',encoding='utf-8') as f:
    data= f.read()
    print(data)

    参数1 文件路径 可以是相对 也可以是绝对
    mode 打开文件的模式
    r(只读)
    w(只写)

    +(可读可写)了解即可
    + 表示可读可写
    w+ == w+t 打开就清空 所以读不到 清空源文件如果不存在则创建
    r+ == r+t 如果不存在则报错
    a+ == a+t 打开就移动光标到末尾 也读不到 如果不存在则创建,光标移动到最后
    可读可写 可用于文本处理 但是对于写别的文件,一般不用,很容易造成文件损坏

    encoding 编码方式 windows默认为GBK Linux默认为utf-8

    读取内容 可以用参数指定要读取的个数,默认为-1 表示全部读取
    需要注意 read(-1)仅限于文件较小时,如果文件太大会造成内存溢出
    data=f.read(2000)
    f.readable() 判断是否可读
    f.writable()判断是否可写
    line=f.readline()

    使用循环 来读取全部内容1
    with open(r'D: ,encoding='utf-8') as f:
    while True:
    line = f.readline()
    if not line:#如果line为空则表示没有内容了
    break
    print(line,end='')
    使用循环 来读取全部内容2
    with open(r'D: ,encoding='utf-8') as f:
    for line in f:
    print(line,end='')

    使用循环 来读取全部内容3
    #一次性读取全部
    with open(r'D: ,encoding='utf-8') as f:
    print(f.readlines())#会将每行放入列表中

    读取相关函数
    read() 读取全部
    read(size) 读取指定大小
    readlines 读取全部
    readlin 读取一行
    readable 是否可读

    注意在W模式写 一旦打开文件 立即清空原来的内容 如果文件不存在则创建新文件
    写入字符串时需要手动拼接换行符
    with open(r'D: ,mode='w',encoding='utf-8') as f:
    f.write('矮跟')
    f.writelines(' '.join(....))
    b:
    在b模式只能写入字节

    可读可写字节模式
    r+b 直接写入 会把原数据覆盖掉
    w+b 打开就清空 所以读不到
    a+b 打开就移动光标到末尾 也读不到
    仅仅单位不同

    在操作非文本文件时,必须明确指定为字节模式
    b 用来指定为字节模式
    注意:
    b 必须与rw连用 rb(readBytes)wb(writeBytes)
    当文件为字节模式时 不能指定encoding参数!

    默认情况下时读写文本模式 也就是t模式同样需要与rw连用
    rt(readText)wt(writeText)
    t模式下 python解释器会自动进行编码和解码而b模式不会

    当模式为字节模式时(rb)单位为字节
    #循环读取全部内容

    with open('xxx.png',mode='rb') as f:
    while True:
    data = f.read(1024)
    if not data:#如果data为空则意味着文件读完了
    break
    print(data)





    追加写入: a 表示追加写入 不会清空原数据 会把光标移动到最后
    a和w都是写入模式 如果文件不存在都会创建新文件
    不同的是 w会清空源文件 a不会清空且会将光标移动到文件额末尾

    控制文件的打开模式
    rwa
    控制操作文件内容的模式
    t

    t 必须与打开模式连用
    各种组合如下:
    rt wt at
    无若是读还是写 都需要指定编码方式,如果不指定 windows默认为GBK linux默认utf-8
    操作系统都是字符为单位
    rb wb ab r+ w+ a+

    关于文件操作的常用函数
    read
    readline
    readlines
    readable

    write
    writelines
    writeable

    关于编码的两个函数
    encode 编码
    decode 解码
  • 相关阅读:
    如何在Ubuntu 20.04 LTS Focal Fossa上安装Webmin
    如何在Linux服务器上创建一个具有管理权限的新用户?
    如何在Ubuntu 20.04 LTS上安装Apache Subversion
    error more than one devices and emulator
    深度学习+CRF解决NER问题
    word2vec训练&IC分词(待)
    tensorflow基础
    (转)pycharm快捷键
    Python包的相对导入时出现问题解决
    python工具使用笔记
  • 原文地址:https://www.cnblogs.com/gengbinjia/p/10234057.html
Copyright © 2011-2022 走看看