文件管理

一、字符编码

1、什么是字符编码
    由文字符号通过>———————————编码——————————>对应到二进制数字
    对应到文字符号<——————————解码——————————-<由二进制数字通过
   字符编码表:
        内涵:一个字符对应一个数字
2、为何要研究字符编码
        为了解决乱码问题
            解决关键:存取数据都用同一张字符编码表
3、储备知识
        1、应用程序任何操作硬件的请求都需要向操作系统发起系统调用,然后由操作系统去操作硬件
        2、文本编辑器存取文件的原理
            1.打开编辑器就打开了启动了一个进程,是在内存中的,所以,用编辑器编写的内容也都是存放与内存中的,断电后数据丢失
            2.要想永久保存,需要点击保存按钮:编辑器把内存的数据刷到了硬盘上。
            3.编写一个py文件(没有执行),跟编写其他文件没有任何区别,都只是在编写一堆字符而已。
        3、python解释器执行py文件的原理
            第一阶段:python解释器启动,此时就相当于启动了一个文本编辑器
            第二阶段:python解释器相当于文本编辑器,去打开test.py文件,从硬盘上将test.py的文件内容读入到内存中
            第三阶段:python解释器解释执行刚刚加载到内存中test.py的代码
            ( ps:在该阶段,即真正执行代码时,才会识别python的语法,执行文件内代码)
        4、总结python解释器与文件本编辑的异同
            1.相同点:python解释器是解释执行文件内容的,因而python解释器具备读py文件的功能,这一点与文本编辑器一样
            2.不同点:文本编辑器将文件内容读入内存后,是为了显示或者编辑,根本不去理会python的语法,而python解释器将文件内容读入内存后,
                     不只是只看到python代码写了什么,而是为了执行python代码、会识别python语法
4、字符编码表的发展历程(三个阶段)
        1、一家独大
            ASCII:只能识别英文字符
                用8个bit对应一个英文字符
        2、天下大乱(相序在不同国家出现了自己的编码表)
            GBK:能识别中文和英文
                用16个bit(2Bytes)对应一个字符
            shift-JIS:能识别日文和英文
            Euc-KR:能识别法语和英文
        3、归于一统(直到Unicode的出现)
            unicode:能识别万国字符
                用16bit(2Bytes)对应一个字符
            再到utf-8优化版本,当今编辑器使用较多的编码表
        总结:字符编码类型
                 英文字符----读到>>内存>>通过>>(ASCII格式的二进制数)>编码---->>写入硬盘》格式为(ASCII格式的二进制数)
            中文、英文字符----读到>>内存>>通过>>(GBK格式的二进制数)>编码---->>写入硬盘》格式为(GBK格式的二进制数)
            日文、英文字符----读到>>内存>>通过>>(Shif-jis格式的二进制数)>编码---->>写入硬盘》格式为盘(Shif-jis格式的二进制数)
                 万国字符----读到>>内存>>通过>>(unicode格式的二进制数)>编码---->>写入硬盘》格式为(utf-8格式的二进制数)
        4、不同字符通过unicode转换为对应版本
            万国字符--->>通过--->>unicode--->>进制编码>>---可存为—-->>utf-8格式文件到内存
            中文、英文--->>通过--->>unicode--->>进制编码>>---可存为—-->>gbk格式文件到内存
            日文、英文--->>通过--->>unicode--->>进制编码>>---可存为—-->>shift-JIS格式文件到内存

二、文件处理

    1、基本步骤
            应用程序----对应 open()打开
            操作系统----对应找到   文件
            计算机硬件---对应读取(硬盘)
            f=open(r"aaa\a.txt",mode="rt",encoding='utf-8')
            f的值:文件对象/文件句柄
            f.read读取  f.close回收系统资源
        with上下文管理
        with open()指定文件路径打开,指定格式,解码标准 .read读取
    2、打开文件的模式有 rwa tb

三、文件打开模式

    操作文件的方法
        1. 打开文件的模式有 rwa tb(默认为文本模式):
            r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
            w,只写模式【不可读;不存在则创建;存在则清空内容】
            a, 之追加写模式【不可读;不存在则创建;存在则只追加内容】
        2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作
t:文本文件
b:字节类型
        (而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
            rb
            wb
            ab
            注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
        3. 了解部分
            "+" 表示可以同时读写某个文件
            r+, 读写【可读,可写】
            w+,写读【可读,可写】
            a+, 写读【可读,可写】
            x, 只写模式【不可读;不存在则创建,存在则报错】
            x+ ,写读【可读,可写】
    控制文件指针移动
            f.read() #读取所有内容,光标移动到文件末尾
            f.readline() #读取一行内容,光标移动到第二行首部
            f.readlines() #读取每一行内容,存放于列表中
            f.write() #针对文本模式的写,需要自己写换行符
            f.write(.encode('utf-8')) #针对b模式的写,需要自己写换行符
            f.writelines() #文件模式
            f.writelines((encoding='utf-8'),) #b模式
         了解
            f.readable() #文件是否可读
            f.writable() #文件是否可读
            f.closed #文件是否关闭
            f.encoding #如果文件打开模式为b,则没有该属性
            f.flush() #立刻将文件内容从内存刷到硬盘
    修改文件的两种方式
        文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改
        平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:
             方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,
                    修改完毕后,再由内存覆盖到硬盘(如:word,vim,nodpad++等编辑器)
             方式二:将硬盘存放的该文件的内容一行一行地读入内存,
                    修改完毕就写入新文件,最后用新文件覆盖源文件

四、文件操作的其他方法

    读操作
    with open('a.txt',mode='rt',encoding='utf-8') as f:
        line1=f.readline()
        print(line1)
        line2 = f.readline()
        print(line2)
        for line in f:
            print(line)
        lines=f.readlines()
        print(lines)

    写操作
     with open('a.txt',mode='wt',encoding='utf-8') as f:
       f.write("1111\n222\n333\n")
        for x in "hello":
            f.write(x)
        f.writelines("hello")  # f.write("hello")
        f.writelines(["1111","222","333"])
        f.flush()
        print(f.name)
        print(f.encoding)

五、控制文件指针移动

     前提:文件内指针移动,除了t模式下的read(n)中n代表的是字符个数,其余的指针移动都是以bytes为单位的
   例如:read(3):
  1. 文件打开方式为文本模式时,代表读取3个字符
  2. 文件打开方式为b模式时,代表读取3个字节
      其余的文件内光标移动都是以字节为单位如seek,tell,truncate
     seek有三种移动方式0,1,2,其中模式可以在t下使用,1和2必须在b模式下进行
         0:参照文件开头移动指针
         1:参照当前所在的位置移动指针
         2:参照文件末尾位置移动指针
     truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,
      所以truncate要在r+或a或a+等模式下测试效果

六、文件修改的两种方式

    方式一:
        1、以r模式打开源文件,将源文件内容全部读入内存
        2、然后在内存中修改完毕
        3、以w模式打开源文件,将修改后的内容写如源文件

        优点:必须要硬盘预留足够的空间
        缺点:需要内存有足够的空间

    方式二:
        1、以r模式打开源文件,然后以w模式打开一个临时文件
        2、从源文件中读一行到内存中,修改完毕后直接写入临时文件,循环往复,直到操作完毕所有行
        3、删除源文件,将临时文件名改名为源文件名

        优点:没有对内存造成过度的占用
        缺点:需要硬盘预留出足够的空间来存放临时文件

你可能感兴趣的:(Python)