• day 0308 编码的进阶 文件操作


    一.编码的进阶:

    在python3以后,字符串和bytes类型彻底分开,字符串以字符为单位进行处理的,bytes类型是以字节为单位处理的。

    bytes数据类型在所有的操作和使用与字符串方法基本一样,也是不可变的序列对象。

    b=b''  #创建一个空的bytes
    c=bytes()#创建一个空的bytes
    print(b)
    print(c)
    #这两个是创建空bytes的表示
    
    s1='alex'
    print(s1,type(s1))#创建一个字符为alex的变量s1,并打印
    s2=b'alex'
    print(s2.upper())#将字符串变成大写下的bytes类型
    print(s2,type(s2))#s2de bytes类型
    
    
    结果:
    alex <class 'str'>
    b'ALEX'
    b'alex' <class 'bytes'>
    
    s1='中国'
    print(s1,type(s1))#打印中文下的字符串类型
    
    
    bytes类型不显示中文,这是与str的区别。
    
    s2=s1.encode('utf-8')#将s1以utf-8编码
    print(b1,type(b1))
    
    结果:
    中国 <class 'str'>
    b'xe4xb8xadxe5x9bxbd' <class 'bytes'>
    #这里中国是两个字符 在utf-8编码下是一个字符三个字节 、xe4是一个字节。
    

      1.将字符串str 转化为utf-8下的bytes

    s1='a太白'
    b1=s1.encode('utf-8')#将字符串转化utf-8的bytes
    print(b1)
    
    结果:b'axe5xa4xaaxe7x99xbd'#在utf-8下字符串一个字符占三个字节,字母占用一个字节
    

      2.将字符串str 转化为 gbk下的bytes。

    s1 = 'a太白'
    b1 = s1.encode('gbk')#将字符串转化成gbk模式下的bytes。encode编码,decode解码
    print(b1)
    
    结果:b'axccxabxb0xd7'#在gbk下一个中文字符占用两个字节,字母占用一个字节
    

      3.在utf-8编码下的bytes 转化成字符串str (unicode)

    b3 = b'axe5xa4xaaxe7x99xbd'
    s1=b3.decode('utf-8')#解码在utf-8模式下转化
    print(s1)
    结果:
    a太白
    

      4.终极转化:在utf-8编码下的bytes 转化成 gbk编码下的bytes。

    b3 = b'axe5xa4xaaxe7x99xbd'#utf-8下的bytes
    #将b3转化成unicode解码
    s = b3.decode('utf-8')
    #再将s编码成gbk
    b4=s.encode('gbk')
    print('b4')
    
    utf-8 bytes————》unicode————》gbk bytes
    

      注意:由于utf-8和gbk编码下的英文都是映射于ASCII,所以直接转化。

    s1='alex!123’
    b1=s1.encode('utf-8')#编码成utf-8 bytes
    s2=b1.decode('gbk')#将utf-8 bytes直接转化成 gbk bytes
    print(s2)
    结果:
    alex!12
    

    二.文件操作的初始:

    f=open('F: pence.txt',encoding='utf-8',mode='r')
    print(f.read())
    f.close()
    

    这里,f变量:f, f1, file, file_handler, ....文件句柄。

       open()—— python的内置函数,python提供的一个功能。

        底层调用的是操作系统的调用文件命令,借口。

        Windows:编码gbk

        linux,ms:编码utf-8

    操作文件的流程:

    1.打开文件,产生一个文件句柄。

    2.打开文件句柄进行文件操作。

    3.关闭文件句柄

    三. 文件的读

    1.read()用法:

    # read ()全部读取
    #1. 打开文件,得到文件句柄并赋值给一个变量
    
    f1=open('r模式',encoding='utf-8')
    
    #默认是‘r'’模式下  省略不写
    #或者写成f1=open('r模式',encoding='utf-8',‘r’)
    #这时已经建立一个文件r模式,并以utf-8编码
    
    #2. 通过句柄对文件进行操作
    
    content=f1.read()
    print(content,type(content))
    
    #3. 关闭文件
    f1.close()
    #其中del f一定要发生在f.close()之后,否则就会导致操作系统打开的文件还没有关闭,白白占用资源,
    而python自动的垃圾回收机制决定了我们无需考虑del f,这就要求我们,在操作完毕文件后,一定要记住f.close()
    

    2.read(n) 用法:

        r模式下:n 字符

        rb模式下:n 字节

    f1 = open('r模式',encoding='utf-8')
    print(f1.read(3))#读取文本内的三个字符
    f1.close()
    
    f1 = open('r模式',mode='rb')
    #默认是在utf-8编码 f2=f1.read(3).decode('utf-8') #读取三个字节 并在以utf-8编码(三个字节对应一个字符) print(f2) f1.close() f1 = open('r模式',mode='rb') print(f1.read(3)) #rb模式下 没有转码 直接显示bytes类型 f1.close()

    3.readline()按照行读取数据:

    f1 = open('r模式',encoding='utf-8')
    print(f1.readline().strip())
    #读取第一行
    print(f1.readline().strip())
    #读取第二行
    print(f1.readline().strip())
    #读取第三行
    f1.close()
    
    结果:
    你擦粉回复 理论在茶几上的
    djadhajk
    迫在眉睫
    

    4. readlines()读取文件所有行数

    返回一个list,列表的每个元素是源文件的每一行

    f1 = open('r模式',encoding='utf-8')
    print(f1.readlines())
    f1.close()
    
    结果:
    ['你擦粉回复 理论在茶几上的
    ', 'djadhajk
    ', '迫在眉睫
    ', '轰轰烈烈']
    

    5.循环读取:

    f1=open('r模式',encoding='utf-8')
    for line in f1:
         print(line)
    f1.close()
    

    6. r b 以字节的形式读取,带b的一般操作的都是非文字类的文件.

     

    f1 = open('美女.jpg',mode='rb')
    #美女.jpg -非文字类文件,mode='rb'以字节形式读取
    print(f1.read())
    #返回值是字节
    f1.close()
    
    结果:
    b'xffxd8xffxe0x00x10JFIFx00x01x01x01x00Hx00Hx00x00xffxfex00;CREATOR: gd-jpeg v1.0 (using IJG。。。。。。。。。。

    # f1 = open('r模式',mode='rb')

    # print(f1.read())
    # f1.close()

    7.r + 读写模式:

    先读后写

    f1 = open('r模式',encoding='utf-8',mode='r+')
    content = f1.read()
    print(content)
    f1.write('666')
    f1.close()
    #先读后写,666添加到文件最后
    

    先写后读:

    f1 = open('r模式',encoding='utf-8',mode='r+')
    f1.write('666')
    print(f1.read())
    f1.close()
    # 先写后读,先把666覆盖文件内容的最前面
    #先写入文件,当写入文件操作完成时,光标已经处于末尾处,当继续读取操作时,光标向后读取,所以内容为空。

    四.文件的写:

    w  w+ wb w+b

    # 没有文件,创建文件,写入内容
    f = open('w.bak模式',encoding='utf-8',mode='w')
    f.write('随便写一点')
    f.close()
    结果:在文件多了一个w.bak模式文件。文件内的内容是便写一点
    

      

    # 如果有文件,先清空内容,后写入
    f = open('w模式',encoding='utf-8',mode='w')
    for i in range(4):
        f.write('Alex is a lower man
    ')
    f.close()
    #w模式文件是用数据的,运行后  文件内容清空后添加四行Alex is a lower man
    

    wb(以二进制写入,跟r b模式一样。非文字类的文件)

    f1 = open('美女.jpg',mode='rb')
    content = f1.read()
    f2 = open('美女3.jpg',mode='wb')
    f2.write(content)
    f2.close()
    #相当于复制美女.jpg 。复制出一个新文件 美女3.jpg(新生成的文件  之前没有)
    

    五.文件的追加:

    a ,   a+ ,  ab,  a+b

    # a   没有文件 创建文件,写入内容
    f = open('b模式',encoding='utf-8',mode='a')
    f.write('很多让人很有成就感的事情')
    f.write('很多让人很有成就感的事情')
    f.write('很多让人很有成就感的事情')
    f.close()
    #在文件中创建文件名:b模式,该文件内写入一行三次'很多让人很有成就感的事情'
    

     

    #a  如果存在该文件,直接在内容后直接添加信息
    f = open('a模式',encoding='utf-8',mode='a')
    f.write('666')
    f.close()
    # a模式内容后面添加666
    

    六.文件的改

        步骤:1,以读的模式打开原文件.

                         2.以写的模式创建一个新文件

           3.将原文件内容读取出来,按照你的要求改成新内容,写入新文件。

           4.删除原文件

           5.将新文件重命名成原文件

    # 1,以读的模式打开原文件.
    # 2,以写的模式创建一个新文件.
    # import os
    # with open('alex自述',encoding='utf-8') as f1,
    #     open('alex自述.bak',encoding='utf-8',mode='w') as f2:
    # # 3,将原文件内容读取出来,按照你的要求改成新内容,写入新文件.
    #     old_content = f1.read()
    #     new_content = old_content.replace('alex','sb')
    #     f2.write(new_content)
    # # 4,删除原文件.
    # os.remove('alex自述')
    # # 5,将新文件重命名成原文件.
    # os.rename('alex自述.bak','alex自述')
    

      

    # import os
    # with open('alex自述',encoding='utf-8') as f1,
    #     open('alex自述.bak',encoding='utf-8',mode='w') as f2:
    # # 3,将原文件内容读取出来,按照你的要求改成新内容,写入新文件.
    #     for old_line in f1:
    #         new_line = old_line.replace('alex','sb')
    #         f2.write(new_line)
    #
    # # 4,删除原文件.
    # os.remove('alex自述')
    # # 5,将新文件重命名成原文件.
    # os.rename('alex自述.bak','alex自述')
    

      DAD6-0E0C-5484-441F DA9D-BA31-9F15-FED6 227F-A673-2B7E-FF74 DFBB-8844-FA17-7265

      

  • 相关阅读:
    第二百三十四天 how can I 坚持
    第二百三十三天 how can I 坚持
    第二百三十二天 how can I 坚持
    第二百三十一天 how can I 坚持
    第二百三十天 how can I 坚持
    第二百二十九天 how can I 坚持
    第二百二十八天 how can I 坚持
    第二百二十七天 how can I 坚持
    GG's Single Day
    杭电2133--What day is it
  • 原文地址:https://www.cnblogs.com/Zhao159461/p/10498626.html
Copyright © 2020-2023  润新知