文件操作和字符编码
字符编码的实际应用
编码和解码
编码
将人类能够读懂的字符编码成计算机能够直接读懂的字符
解码
将计算机能够直接读懂的字符解码成人类能够读懂的字符
s1 = '事已至此 何不一搏'
# 编码 encode
# print(s1.encode('gbk'))
"""
字符串前面如果加了字母b 表示该数据类型为 bytes类型
bytes类型可以看成是二进制
"""
# 解码 decode
# res = b'\xca\xc2\xd2\xd1\xd6\xc1\xb4\xcb \xba\xce\xb2\xbb\xd2\xbb\xb2\xab'
# print(res.decode('gbk'))
"""
基于网络传输数据 数据都必须是二进制格式
所以肯定涉及到编码与解码
"""
字符编码
1.字符编码
计算机内部存储数据都是以二进制数字的形式储存
计算机基于点工作 而电信号只有高低电频两种状态
我们人为的将高低电频定义为数字1
低电频数字为0
假如0代表你
1代表我
00 01 10 11
000 001 ....
单位换算
比特位(二进制数的个数)
8bit = 1bytes 00000000相当于2**8种可能
1024B = 1kB
1024KB = 1MB
1024MB = 1G
1024GB = 1TB
1024TB = 1PB
我们强调的字符编码仅限于文本文件,其他文件都不适用
字符编码的发展史
#一家独大
计算机是由美国人发明的,美国人需要计算机识别英文,所以
美国人就发明了字符编码表(ASCII码),这个字符编码表
记录了英文与数字的对应关系
1bytes 来表示所有的英文及符号。 2**8=256种
所有英文字母加起来都不超过128种可能,留有余地
#群雄割据
中国
中国人为了计算机识别中文,发明了我们自己的编码表(GBK码)
他里面记录了中文 英文 与数字的对应关系
GBK用2个bytes(远远不够)来表示中文及符号
生僻字可能会使用更多的bytes.
日本
日本人为了计算机能够识别日文,发明了(shift_JIS码)
记录了日文 英文与数字的对应关系
韩国
韩国人为了为了计算机能够识别韩文,发明了(Euc_kr码)
记录了韩文 英文与数字的对应关系
#天下一统
unicode万国码 几乎是所有国家文字与数字对应的关系
所有的字符用2bytes表示,不够也是继续增加
最后由引进utf8()
utf8转换格式 其实是缩写(unicode transformation format)
英文还是用1butes
中文改用3bytes
内存使用的编码表是unicode 硬盘使用的是utf8
文本文件编码统一使用utf8
如何解决乱码
数据当初以什么编码编的就以什么编码解即可
res1 = s1.encode('gbk')
print(res1) # 编码
res2 = res1.decode('euc_kr')
print(res2) # 乱码
res3 = res1.decode('gbk')
print(res3) # 正常显示
python解释器层面
python2解释器默认的编码是ASCII码
1.文件头:必须写在文件的最上方 告诉解释器使用指定的编码
# coding:utf8
# -*- coding:utf8 -*- 美化写法
2.字符前缀:在使用python2解释器的环境下定义字符串习惯在前面加u
name = u'你好啊'
python3解释器默认的编码是utf8

文件操作
# 什么是文件
操作系统暴露给用户可以直接操作硬盘的快捷方式
# 代码操作文件的流程
1.打开文件、创建文件
2.编辑文件内容
3.保存文件内容
4.关闭文件
# 基本语法结构
结构1(了解即可):
f1 = open()
f1.close()
结构2(推荐使用):
with open() as f:
pass
# 1.使用关键字打开文件
'''以后写路径为了防止特殊符号 直接加r'''
# open(r'a.txt') # 相对路径
# open(r'D:\py1\day09\a.txt') # 绝对路径
# res = open(r'a.txt', 'r', encoding='utf8')
"""
open(文件的路径,文件的操作模式,文件的编码)
1.文件的路径是必须要写的
2.文件的操作模式、文件的编码有时候不用写(一会儿讲)
"""
# print(res.read()) # 读取文件内容
# res.close() # 关闭文件
"""上述操作open完最后都需要执行close 而close这一行很任意被遗忘"""
# with上下文管理
with open(r'a.txt', 'r', encoding='utf8') as f: # f = open()
data = f.read()
print(data)
文件的读写方式
r read 只读模式:只能读不能写
w write 只写模式:只能写不能读
a append 只追加模式:在文件末尾添加内容
# r模式
# 路径不存在:直接报错
# with open(r'b.txt', 'r', encoding='utf8') as f1:
# # pass (推荐)补全语法结构 本身没有任何功能
# # ... (不推荐)补全语法结构 本身没有任何功能
# pass
# 路径存在:正常打开文件并等待内容读取
with open(r'a.txt', 'r', encoding='utf8') as f1:
# print(f1.read()) # 一次性读取文件内所有的内容
f1.write('python是最牛逼的语言!!!') # 报错
"""
able在英语中大部分情况下表示的是 具备...的能力
readable 具备读的能力
writable 具备写的能力
...
"""
# w模式
# 路径不存在:自动创建文件
# with open(r'b.txt', 'w', encoding='utf8') as f1:
# pass (推荐)补全语法结构 本身没有任何功能
# ... (不推荐)补全语法结构 本身没有任何功能
# pass
# 路径存在:先清空文件内容 之后再写入数据
with open(r'a.txt', 'w', encoding='utf8') as f1:
f1.write('你们是我见过的最优秀一批学生1\n') # 写入文件内容
f1.write('你们是我见过的最优秀一批学生2\r') # 写入文件内容
f1.write('你们是我见过的最优秀一批学生3\n') # 写入文件内容
print(f1.read())
"""
换行 最早的时候:\r\n
为了节省空间支持一个字符 根据操作系统的不同可能有所区别
\n 、 \r
"""
# a模式
# 路径不存在:自动创建文件
# with open(r'c.txt', 'a', encoding='utf8') as f1:
# pass
# 路径存在:不会清空文件内容 而是在文件末尾等待新内容的添加
# with open(r'a.txt', 'a', encoding='utf8') as f1:
# f1.write('哈哈哈哈或或或或或')
# print(f1.read())
文件的操作模式
#t模式
文本模式 是默认的模式
r rt
w wt
a at
1.该模式只能操作文本文件
2.该模式必须要指定encoding参数
3.该模式读写都是以字符串为最小单位
#b模式
二进制模式 可以操作任意类型的文件
rb 不能省略b
wb 不能省略b
ab 不能省略b
1.该模式可以操作任意类型的文件
2.该模式不需要指定encoding参数
3.该模式读写都是以bytes类型为最小单位
#关于二进制的读写总结
# 总结:
如果是按照二进制打开文件的,要写入或者读取一定要编码 解码。
# 对于二进制的读与写,要进行对应结构的编码与解码,编码和解码用相同的方式才行。中文也可以解析出。
# 写的时候:str_bytes='I am jiyongjia嘉 !'.encode('utf-8')
# 读的时候:str2=f2.read().decode('utf-8')
'''
如果不进行decode解码输出的话会是:b'I am jiyongjia\xe5\x98\x89 !' 它是一个 <class 'bytes'> 非字符串,不好操作、
如果使用了decode 解码再输出的话,输出结果是一个I am jiyongjia嘉 ! 它是一个 <class 'str'>
文件的内置方法
read() # 一次性读取文件内容
1.执行完之后光标在文件末尾 继续读取没有内容
2.当文件内容特别大的时候 容易造成内存溢出(满了)
readline() # 一次只读一行内容
readlines() # 结果是一个列表 里面的各个元素是文件的一行行内容
readable() # 判断当前文件是否可读
支持for循环 # 一行行读取文件内容(推荐使用) 内存中同一时刻只会有一行内容
write() # 写入文件内容(字符串或者bytes类型)
writelines() # 可以将列表中多个元素写入文件
writable() # 判断文件是否可写
flush() # 相当于主动按了ctrl+s(保存)
