字符编码与文件操作

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、相对路径:相对于当前执行文件所在的文件夹开始找
posted @ 2019-07-20 14:22  朝朝哥  阅读(224)  评论(0编辑  收藏  举报