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

    一、字符编码

    1、字符编码的基本知识 

       python解释器执行py文件的原理:

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

     

        第二阶段:python解释器相当于文本编辑器,去打开test.py文件,从硬盘上将test.py的文件内容读入到内存中(小复习:pyhon的解释性,决定了解释器只关心文件内容,不关心文件后缀名)

     

        第三阶段:python解释器解释执行刚刚加载到内存中test.py的代码( ps:在该阶段,即执行时,才会识别python的语法,执行文件内代码,执行到name="egon",会开辟内存空间存放字符串"egon")  

     ps:前两个阶段只是读取,和别的文本编辑器一样。第三阶段负责执行,需开辟新的内存空间。

    2、什么是字符编码

             字符编码的过程:字符--------(翻译过程)------->数字 

                 这个过程实际就是一个字符如何对应一个特定数字的标准,这个标准称之为字符编码

    以下两个场景下涉及到字符编码的问题:

      1. 一个python文件中的内容是由一堆字符组成的(python文件未执行时)

      2. python中的数据类型字符串是由一串字符组成的(python文件执行时)

    3、字符编码的发展史

           阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII

           阶段二:为了满足中文,中国人定制了GBK

           阶段三:各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。

                  产生了unicode, 统一用2Bytes代表一个字符, 2**16-1=65535,可代表6万多个字符,因而兼容万国语言-------------

                     内存中使用的编码是unicode,用空间换时间(程序都需要加载到内存才能运行,因而内存应该是尽可能的保证快)

                  产生了UTF-8,对英文字符只用1Bytes表示,对中文字符用3Bytes-------------

                     硬盘中或者网络传输用utf-8,网络I/O延迟或磁盘I/O延迟要远大与utf-8的转换延迟,而且I/O应该是尽可能地节省带宽,保证数据传输的稳定性。

    4、字符编码的使用

    unicode----->encode-------->utf-8

     

    utf-8-------->decode---------->unicode

    1.1 乱码一:存文件时就已经乱码

    存文件时,由于文件内有各个国家的文字,我们单以shiftjis去存,

    本质上其他国家的文字由于在shiftjis中没有找到对应关系而导致存储失败,用open函数的write可以测试,f=open('a.txt','w',encodig='shift_jis')

    f.write('你瞅啥 何を見て ') #'你瞅啥'因为在shiftjis中没有找到对应关系而无法保存成功,只存'何を見て '可以成功

    但当我们用文件编辑器去存的时候,编辑器会帮我们做转换,保证中文也能用shiftjis存储(硬存,必然乱码),这就导致了,存文件阶段就已经发生乱码

    此时当我们用shiftjis打开文件时,日文可以正常显示,而中文则乱码了

    1.2 乱码二:存文件时不乱码而读文件时乱码

    存文件时用utf-8编码,保证兼容万国,不会乱码,而读文件时选择了错误的解码方式,比如gbk,则在读阶段发生乱码,读阶段发生乱码是可以解决的,选对正确的解码方式就ok了,而存文件时乱码,则是一种数据的损坏。

    总结:

    无论是何种编辑器,要防止文件出现乱码(请一定注意,存放一段代码的文件也仅仅只是一个普通文件而已,此处指的是文件没有执行前,我们打开文件时出现的乱码)

    核心法则就是,文件以什么编码保存的,就以什么编码方式打开

    2、程序执行的三个阶段:

    阶段一:启动python解释器

    阶段二:python解释器此时就是一个文本编辑器,负责打开文件test.py,即从硬盘中读取test.py的内容到内存中

    阶段三:读取已经加载到内存的代码(unicode编码的二进制),然后执行,执行过程中可能会开辟新的内存空间,比如x="egon

     

    浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器

     

    如果服务端encode的编码格式是utf-8, 客户端内存中收到的也是utf-8编码的二进制。

    3.1   在python2中有两种字符串类型str和unicode

                在python2中,str就是编码后的结果bytes,str=bytes,所以在python2中,unicode字符编码的结果是str/bytes

    对于unicode格式的数据来说,无论怎么打印,都不会乱码

     

    python3中的字符串与python2中的u'字符串',都是unicode,所以无论如何打印都不会乱码

    3.2   在python3 中也有两种字符串类型str和bytes

    str是unicode

    #coding:utf-8
    s='' #当程序执行时,无需加u,'林'也会被以unicode形式保存新的内存空间中,
    
    #s可以直接encode成任意编码格式
    s.encode('utf-8')
    s.encode('gbk')
    
    print(type(s)) #<class 'str'>

     

     

    bytes是bytes

    #coding:utf-8
    s='' #当程序执行时,无需加u,'林'也会被以unicode形式保存新的内存空间中,
    
    #s可以直接encode成任意编码格式
    s1=s.encode('utf-8')
    s2=s.encode('gbk')
    
    
    
    print(s) #
    print(s1) #b'xe6x9ex97' 在python3中,是什么就打印什么
    print(s2) #b'xc1xd6' 同上
    
    print(type(s)) #<class 'str'>
    print(type(s1)) #<class 'bytes'>
    print(type(s2)) #<class 'bytes'>

     

     

    二、文件处理

    1、文件处理流程

      1. 打开文件,得到文件句柄并赋值给一个变量
      2. 通过句柄对文件进行操作
      3. 关闭文件 

    2、基本操作

    2.1 文件操作基本流程初探

     

      1. 打开文件,得到文件句柄并赋值给一个变量
      2. 通过句柄对文件进行操作
      3. 关闭文件
    1. 2  打开文件的模式有:

      • r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
      • w,只写模式【不可读;不存在则创建;存在则清空内容】
      • x, 只写模式【不可读;不存在则创建,存在则报错】
      • a, 追加模式【可读;   不存在则创建;存在则只追加内容】

      "+" 表示可以同时读写某个文件

      • r+, 读写【可读,可写】
      • w+,写读【可读,可写】
      • x+ ,写读【可读,可写】
      • a+, 写读【可读,可写】

       "b"表示以字节的方式操作

      • rb  或 r+b
      • wb 或 w+b
      • xb 或 w+b
      • ab 或 a+b

       注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

    2.3 文件的修改

        

    import os
    with open('a.txt','r',encoding='utf-8') as read_f,
            open('.a.txt.swap','w',encoding='utf-8') as write_f:
        for line in read_f:
            if line.startswith('hello'):
                line='哈哈哈
    '
            write_f.write(line)
    
    os.remove('a.txt')
    os.rename('.a.txt.swap','a.txt')
    转载请注来源:https://github.com/fugui0310
  • 相关阅读:
    一句话木马
    JNLP介绍
    游戏是如何检测到有OD等调试工具的
    反调试技巧总结原理和实现
    .do百度百科
    Dadong's JSXX 0.39 VIP所用shellcode调试
    strcat
    C++:Singleton模式
    Win32:即给编辑框添加新窗口过程,也保留原来的窗口过程属性
    摘:C语言数字转换为字符串
  • 原文地址:https://www.cnblogs.com/yifugui/p/7230794.html
Copyright © 2011-2022 走看看