day02 文件

一,字符编码表

  就是字符与机器语言一一对应关系的一个总结表

二,字符编码发展历史

  • 第一阶段,只能识别英语,ASCII表
  • 第二阶段,各个国家发展自己的编码表
    • 中国,gbk
    • 日本,Shift_JIS
  • 第三阶段,统一阶段,unicode,进行了统一,但是因为历史原因,这个只能应用于内存,在硬盘上还是百家齐放。
    • 在特点上:
      • 兼容万国的编码
      • 编码需要与其他编码有相对应的映射/转换关系

          

  • 第四阶段,但是还是不能解决中文与日文等的相互转化,所以有了UTF-8
    • 但是这时候内存还是以unicode为主,因为unicode有和各国相互转换的功能,所以算是一个过渡版本
  • 总结一下就是,用支持相应语言的编码进行编码,用什么编码就用什么解码

三,可能出现的问题

  在python2中读文件是默认的是ASCII码,python3中默认的是UTF-8。所以如果是用其他写的就需要在第一行上写如下内容:

1 # coding: 当初文件写入硬盘时采用的编码格式   读此行时是用默认的编码语言进行解读
  • str类型
    • 对于python3而言,str类型默认直接存成unicode格式,无论如何不会乱码
    • 对于python2而言,str类型需要前面加上u,达到转变为unicode

四,编码与解码

1 # 1、unicode格式------编码encode-------->其它编码格式
2 >>> x='' # 在python3在''被存成unicode
3 >>> res=x.encode('utf-8')
4 >>> res,type(res) # unicode编码成了utf-8格式,而编码的结果为bytes类型,可以当作直接当作二进制去使用
5 (b'\xe4\xb8\x8a', <class 'bytes'>)
6 
7 # 2、其它编码格式------解码decode-------->unicode格式
8 >>> res.decode('utf-8') 
9 ''

五,文件

  1,操作系统是直接控制硬盘的,而文件是一种让用户间接控制的一种方法。所以,操作文件就是操作硬盘。          

                

  2,如何使用文件:open()

      控制文件的读写内容的模式

      • t,文本
        • 读写都是str(unicode)为单位的
        • 必须指定encoding=‘utf-8
        • 文本文件
      • b,二进制/bytes
      • 注意,t模式和b模式只是读的一种方式,真正操作还是需要其他的配合

 六,操作文件

  1,打开文件,注意防止转义符

open(r'c:/Users/dell/Desktop')
    • 第一种,在文件前面加上r
    • 第二种,使用‘/’
      • 补充知识点:相对路径与绝对路径
        • 相对路径,以打开的文件为基准,进行访问
        • 绝对路径,如:C:\Users\dell\PycharmProjects\s14\day1\1.py 
1 f=open(r'venv\2.py',mode='rt',encoding='utf-8(没有指定时,liunx默认的是utf-8,windows默认的是gbk)') #此操作相当于给变量赋值和间接操作硬盘 
2 print(f)
3 ************
4 <_io.TextIOWrapper name='venv\\2.py' mode='r' encoding='cp936'>

  2,操作文件:读文件/写文件

    该过程是应用程序向操作系统调用,然后操作系统对硬盘进行操作

1 ret=f.read()
2 print(ret)

  3,关闭文件

 1 f.close() #回收操作系统资源 2 del f #回收应用程序资源 (但是第二步就算不进行操作,应用程序也会自己进行解除)

    还有一种简单的打开文件的方法:

1 with open(r'venv') as f1:   #不用写close
2     print(f1.read())

  4,以t模式下演示

  • rt,只读模式(当文件不存在时会报错),阅读完后指针停到最后。所以如果读第二遍需要重新打开文件,或者控制指针
    1 with open(r'venv\2.py',mode='rt',encoding='utf-8') as f:
    2     ret=f.read()
    3     print(ret)
  • wt,只写模式(当文件不存在时会创建,当文件已有时会清空),写完后指针会在第一行,不能阅读
    • 如果在文件打开后没有关闭后多行写入,不会发生清空,会在后面追加
      1 with open('b.txt',mode='w',encoding='utf-8') as f:
      2     f.write('你好\n')
      3     f.write('我好\n') 
      4     f.write('大家好\n')
      5     f.write('111\n222\n333\n')
  • at,只追加模式(当文件不存在时会创建),打开已存在文件指针会停到最后一行,不能阅读
    • 强调 w 模式与 a 模式的异同:
      • # 1 相同点:在打开的文件不关闭的情况下,连续的写入,新写的内容总会跟在前写的内容之后
      • # 2 不同点:以 a 模式重新打开文件,不会清空原文件内容,会将文件指针直接移动到文件末尾,新写的内容永远写在最后 
  • 了解,一般不会用到,在实际工作中都是只读或只写
    • r+t,在此模式下,可读可写,打开不存在文件时还是会报错,如果指针在第一行的话会覆盖原内容
    • w+t,在此模式下,可读可写,读的时候需要控制指针
    • a+t,在此模式下,可读可写,读的时候需要控制指针
    • x模式,只写模式,不存在就创建,存在就报错

  5,读,写的相关操作

    • 读的代码
      f.read()  # 读取所有内容,执行完该操作后,文件指针会移动到文件末尾
      f.readline()  # 读取一行内容,光标移动到第二行首部
      f.readlines()  # 读取每一行内容,存放于列表中
      • 第一种,第三种都容易导致文件过大,内存崩溃
    • 写的相关操作
      • f.writelines:适用于列表等需要多次写入的情况
        1 f.writelines(['333\n','444\n']) 
      • 如果是数字、字母转为字节只需要前面加上b即可
        1 f.write('11aa\n222\n'.encode('utf-8')) 
        2 想当于
        3 f.write(b'11aa\n222\n') 
    • 转为字节两种方式
      1 "".encode('utf-8')
      2 bytes(''.encode('utf-8'))

  6,f.read()

    • 在t模式下(如果要写入的是数字类型就会报错,需要转成字符串),硬盘的二进制读入内存:会将二进制进行decode解码
      • 1,读写都是以字符串(unicode)为单位
      • 2,只能针对文本文件
      • 3,必须指定字符串编码,即必须指定encoding参数
    • 在b模式下,硬盘的二进制读入内存:不做任何转换,直接读入内存
      • 1,读写是以bytes为单位
      • 2,可以针对所有文件
      • 3,一定不能指定字符编码,即一定不能指定encoding参数
    • 总结:
      1、在操作纯文本文件方面t模式帮我们省去了编码与解码的环节b模式则需要手动编码与解码,所以此时t模式更为方便
      2、针对非文本文件(如图片、视频、音频等)只能使用b模式

   7,循环读文件的两种方式

    • 第一种,while,是每次都读取指定字节
      1 with open('1.mp4',mode='rb') as f:
      2     while True:
      3         data=f.read(1024) # 同一时刻只读入1024个Bytes到内存中
      4         if len(data) == 0:
      5             break
      6         print(data)
    • 第二种,for,按行读取,但是如果遇到每行特别长的情况下,最好使用第一种
      1 with open('a.txt',mode='rt',encoding='utf-8') as f:
      2     for line in f:
      3         print(line) # 同一时刻只读入一行内容到内存中

  8,了解

    • f.flush()  # 立刻将文件内容从内存刷到硬盘,但是谨慎使用,一般用于测试
    • f.readable()  # 文件是否可读
    • f.writable()  # 文件是否可写
    • print(f.closed)  # 文件是否关闭
    • f.encoding  # 如果文件打开模式为b,则没有该属性
    • f.name,查看文件名字

  9,指针

    指针的移动都是Bytes为单位的,唯一例外的是t模式下的read(n),n以字符为单位

    f.seek(n,模式):指针一般是以字节为单位

    • n,指的是移动个数,可以是负数
    • 模式
      • 0,参照物是文件开头位置
      • 1,参照物为当前指针所在个数
      • 2,参照物永远是末尾位置
      • 注意,只有0才可以在t模式下使用,1,2可以在b模式下使用
    • f.tell(),获取文件当前指针位置

  10,文件的两种修改方式

    注意:

      1、硬盘空间是无法修改的,硬盘中数据的更新都是用新内容覆盖旧内容

      2、内存中的数据是可以修改的

    • 方式
      • 1
        1 # 实现思路:将文件内容发一次性全部读入内存,然后在内存中修改完毕后再覆盖写回原文件
        2 # 优点: 在文件修改过程中同一份数据只有一份
        3 # 缺点: 会过多地占用内存
        4 with open('db.txt',mode='rt',encoding='utf-8') as f:
        5     data=f.read()
        6 
        7 with open('db.txt',mode='wt',encoding='utf-8') as f:
        8     f.write(data.replace('kevin','SB'))

      • 2
         1 # 实现思路:以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,修改完后写入临时文件...,删掉原文件,将临时文件重命名原文件名
         2 # 优点: 不会占用过多的内存
         3 # 缺点: 在文件修改过程中同一份数据存了两份
         4 import os
         5 
         6 with open('db.txt',mode='rt',encoding='utf-8') as read_f,\
         7         open('.db.txt.swap',mode='wt',encoding='utf-8') as wrife_f:
         8     for line in read_f:
         9         wrife_f.write(line.replace('SB','kevin'))
        10 
        11 os.remove('db.txt')
        12 os.rename('.db.txt.swap','db.txt')
      • 看情况选择使用

posted on 2024-02-02 01:58  我才是最帅的那个男人  阅读(9)  评论(0)    收藏  举报

导航