0222-0224字符编码与文件处理
0222-0224字符编码与文件处理
1.字符编码
- 字符编码只跟文本文件和字符串有关,跟音频、视频文件之类的都没有关系。
- 定义:计算机内部只认识二进制,但是人类语言有各种各样的样式,为了让计算机能够认识人类的语言,内部有一种机制就是将人类语言转为计算机语言。
- 字符编码:记录了人类语言与数据之间的对应关系
2.字符编码的发展史
- 一家独大:美国发明ASCII码表
- 只有英文字符与数字的对应关系
- 一个英文字符对应1Byte=8bits,最多包含256哥数字,对应256个字符
- 0-9 48-57 A-Z 65-90 a-z 97-122,所以小写字母对应的数字一定大于大写字母
- 群雄割据
- 中国发明GBK码:只有中英问字符与数字的对应关系,一个英文字符对应1个字节,一个中文字符对应2个字节
- 韩国发明Euc-kr表:只有韩英文字符与数字的对应关系
- 日本发明Shift-JIS表:只有日英字符与数字的对应关系
- 一统天下:unicode表(万国码)
- 存在所有语言中的所有字符与数字的对应关系,即兼容万国字符
- unicode码只在内存中起作用,使用2个字节类存储一个字符
- utf-8是unicode的转换格式,一个英文字符占1Bytes,一个中文字符占3Bytes,生僻字更多,只能存储正常的字符,utf8mb4可以存储表情
3.字符编码的应用
-
解决乱码问题
文本文件使用什么字符编码保存,打开的时候就要使用对应的字符编码
-
python解释器版本不同带来的差异
- python2 使用的字符编码是ASCII表
- python3 使用的是utf-8编码
-
pycharm添加文件模板
settings-editor-file and code template-python script
-
编码与解码[核心]
# 编码:将人类能够读懂的语言转为计算机能够读懂的语言
# 解码:将计算机能够读懂的语言转为人类能够读懂的语言
ss = '你好me'
# 编码
#byte字节
s1 = ss.encode('utf-8')
print(s1,type(s1)) # b'\xe4\xbd\xa0\xe5\xa5\xbdme' <class 'bytes'>
# 解码
print(s1.decode('utf-8')) # 你好me
s = b'kevin123' # 只有英文字符和数字,要想解码的话,直接使用前缀b
print(s.decode('utf8')) #
4.文件介绍
-
文件的类型:txt word excel py,是python操作文件
-
三步骤[open]:1.打开文件 2.操作文件 3.关闭文件
# 1.打开文件 open('文件路径','读写模式','字符编码') f = open('a.txt', 'r', encoding='utf-8') print(f) # <_io.TextIOWrapper name='a.txt' mode='r' encoding='utf8'> 文件句柄 # 2.操作文件 print(f.read()) # 3.关闭文件 f.close() # r的作用:当路径中可能存在有转义的字符时,字符串嵌满加上r来解决转义的问题 r'D:\python25\day09\a.txt'
5.文件的读写模式
-
r >>> read:只读不写
-
w >>> write:只写不读
-
a >>> append:追加
# 1.r 路径不存在,直接报错 # 2.w 如果路径不存在,会新建一个文件夹;会先清空文件中的内容再进行写内容 # 3.a 如果路径不存在,会新建一个文件夹;指挥在文件末尾追加内容
6.文件的操作方法
# 1.读系列
f.read() # 一次性读取文件内所有数据,存在漏洞,内容过大会内存外溢
f.readline() # 一次读取一行
f.readlines() # 把文件内的一行一行数据组装成列表元素返回,注意末尾的换行符
f.readable() # 返回布尔值,是否可读
# 2.写系列
f.write()
f.writelines() #用列表写,一般不用,麻烦
f.writable() # 返回布尔值,是否可写
7.文件读操作优化
with open('a.txt', 'r', encoding='utf-8') as f:
print(f.read())
'''文件句柄f支持for循环'''
for line in f:
print(line) # 一次代码一行数据
'''以后读取文件数据时,都用for循环一行一行读取,不会出现内存溢出'''
with open('a.txt', 'w', encoding='utf-8') as f:
f.write('hello')
f.flush() # 把内存中得数据立刻刷到硬盘中
8.文件的操作模式
-
r w a模式
""" 1. 只能操作文本文件 2. 都是以字符为单位 3. rt wt at => t可以省略 4. encoding参数必须写 """
-
b模式:二进制
""" 1.能够操作任意的数据类型,eg:文本、视频、音频 2.以字节为单位 3.rb ab wb >>>:b不可以省略 4.encoding参数不写 """ with open('b.txt','wb') as f: s = '你好' f.write(s.encode('utf-8')) with open('b.txt','rb') as f: print(f.read().decode('utf-8'))
9.文件二进制读操作
with open('b.txt','rb') as f:
print(f.read(3).decode('utf-8'))
'''
1.r模式
read()里面的数字代表的是一个字符
2.b模式
read()里面的数字代表的是一个字节
'''
10.文件的移动指针[了解]
with open('b.txt','rb') as f:
print(f.read(12).decode('utf-8'))
f.seek(3,0) # 控制指针的移动
f.seek(3,1) # 控制指针的移动
f.seek(3,2) # 控制指针的移动
print(f.read(),decode('utf-8'))
'''
f.seek总共有3种模式
1.offset参数
偏移量,移动的位置
如果是正数,从左往右读取
如果是负数,从右往左读取
2.whence参数
0:默认的模式,该模式代表指针移动的字节数是以文件开头为参照的
1:该模式代表指针移动的字节数是以当前所在的位置为参照的
2:该模式代表指针移动的字节数是以文件末尾的位置为参照的
'''
# 小练习:实现动态查看最新一条日志的效果
import time
with open('access.log',mode='rb') as f:
f.seek(0,2)
while True:
line=f.readline()
if len(line) == 0:
# 没有内容
time.sleep(0.5)
else:
print(line.decode('utf-8'),end='')
11.文件的修改[了解]
# 方式一:先将文件内容一次性读入内存,然后使用字符串内置方法替换数据,最后把替换之后的数据写入文件
# 1. 读取b.txt文件数据
with open('b.txt', 'r', encoding='utf-8') as f:
data = f.read()
print(data) # kevin kevin kevin kevin say hello world
new_data = data.replace('kevin', 'jack')
# 2. 把新的数据再次写入文件
with open('b.txt', 'w', encoding='utf-8') as f1:
f1.write(new_data)
# 方式二:以读的方式打开源文件,以写的方式打开一个临时文件,一行行读取源文件内容,修改完后写入临时文件,删除源文件,将临时文件重命名为源文件名
import os
with open('a.txt','rt',encoding='utf-8') as read_f:
with open('b.txt',mode='wt',encoding='utf-8') as wrife_f:
for line in read_f:
wrife_f.write(line.replace('SB','kevin'))
os.remove('a.txt') # 删除源文件
os.rename('b.txt','a.txt')