zoukankan      html  css  js  c++  java
  • 字符编码与文件操作

    1. 字符单位转换

    单位:
    bit——比特(二进制位)
    Bytes——字节
    KB——千字节
    MB——兆字节
    GB——吉字节
    
    转换:
    1Bytes=8 bit
    1KB=1024Bytes
    1MB=1024KB
    1GB=1024MB
    1TB=1024GB
    
    不同编码下的字符大小:
    1、ASCII码表:用1Bytes表示一个英文字符1英文字符=8bit=1Bytes
    2、GBK:用2Bytes表示一个中文字符,1Bytes去表示英文字符
    3、 utf-8 用1Bytes表示英文,用3Bytes表示中文
    3、unicode:内存中使用的是unicode编码,unicode把全世界的字符都建立好对应关系用2Bytes去表示一个字符
    
    注:utf-8是unicode的可变长编码,更加灵活,如果存储英文更省空间;且支持ASCII编码,解决历史遗留问题
    

    2.编码使用

    1、内存中固定使用unicode编码,可以改变的存储到硬盘时使用的编码
    2、要想保证存取文件不乱码,应该保证文档当初是以什么编码格式存的,就应该以什么编码格式去读取
    
    • 编码与解码
    unicode-------编码encode-------->gbk
    unicode<-------解码decode--------gbk
    
    • py2与py3 对比
    1、在python2中也可以制造unicode编码的字符串。需要在字符串前加u
    2、在python3中的字符串类型str都是unicode编码的所以python3中的字符串类型可以编码成其他字符编码格式,编码的结果
    是bytes类型
    

    3.文件基本操作

    • 操作模式
    1、默认t文本模式,文本文件才有字符编码的概念:
    读:rt
    写:wt
    追加:at
    
    2、b:二进制模式
    注意:
    1、一定不能指定字符编码,只有t模式才与字符编码有关
    2、b是二进制模式,是一种通用的文件读取模式,因为所有的文件在硬盘中都是以二进制形式存放的
    # 文件e的内容写入文件j
    with open('e.txt','rb') as f,
            open('j.txt','wb') as f1:
        #文件的操作
        f1.write(f.read())
    
    • 文件指针移动
    f.seek(offset,whence)
    #offset代表文件的指针的偏移量,单位是字节bytes
    #whence代表参考物,有三个取值
    #0:参照文件的开头
    #1:参照当前文件指针所在位置
    #2: 参照文件末尾,偏移量指定负数
    强调:其中whence=1和whence=2只能在b模式下使用
    注:快速移动到文件末尾f.seek(0,2)
    -----------------------------------
    例:
    f=open('c.txt',mode='rt',encoding='utf-8')
    f.seek(9,0) # 从文件开头移动9个bytes
    print(f.tell()) # 字节数,每次统计都是从文件开头到当前指针所在位置
    print(f.readline()) # 指针移动后所在行的内容
    f.close()
    
    • 特殊情况
    # 只有在t模式下的read(n),n代表的是字符个数,除此之外其他但凡涉及文件指针的移动都是以字节为单位的
    # f=open('c.txt',mode='rt',encoding='utf-8')
    # print(f.read(3))
    # f.close()
    
    • 文件覆盖
    方式一:
    先以读的模式获取内容进行修改,再以写的模式将修改过后的内容写入
    方式二:
    打开要修改的文件,进行修改,将修改之后的内容写入新文件名,将旧文件删除,最后把新文件名改成之旧文件名
    -------------------------------------
    #在原文件进行修改,读出后保存,在写
    #优点:修改期期间文件内容只用一份
    #缺点:文件过大时会占用过大的内存空间
    with open('rrf.txt','r',encoding= 'UTF-8')as f :
       x=f.read()
    x.replace('我的','你的')   #修改内容
    with open('rrf.txt','w',encoding= 'UTF-8')as f:
        f.write(x )
    
    #创建新文件进行覆盖
    #优点:同一时刻只有一行内容存在于内存
    #缺点:修改期间始终有两份文件
    import os
    with open('rrf.txt','r',encoding= 'UTF-8')as f,
       open('bbt','w',encoding='UTF-8' )as f1:
        for x in f:
            f1.write(x.replace('半倚深秋','qq'))
    
    os.remove('rrf.txt') # 删除老文件
    os.rename('bbt','rrf.txt')  #把新文件名字改成老文件名字
    
    • 路径
    1、绝对路径:从盘符(C:\ E:\ D:\)开始写一个完整的路径
    2、相对路径:相对于当前执行文件所在的文件夹开始找
    
  • 相关阅读:
    把安卓QQ浏览器下载的视频m3u8列表文件转成mp4格式(或者其它视频格式)
    Win8系统删除历史用户本地头像
    大叔郑州街头卖刀 这口才应该上春晚啊
    从尽力而为到全力以赴
    用虚假邮箱注册微博
    百度网盘总结
    试用Sublime Text 3
    玉米地烧毁,相关部门让找鸟儿去索赔
    Video Download Helper总结
    9.29
  • 原文地址:https://www.cnblogs.com/quqinchao/p/9134175.html
Copyright © 2011-2022 走看看