day 08字符编码 文件处理

字符编码
1、软件启动流程(打开notepad++文档)
从硬盘将软件加载到内存上
加载test.txt到内存中
执行notepad++的代码,将test.txt打到屏幕上

python解释器也是一个应用软件
从硬盘将软件加载到内存上
加载test.py文件读到内存
解释器解析python语法
文本编辑器与解释器打开文件的前两个阶段的是一致的,仅第三个阶段不同

什么是字符编码?字符编码表
编码:按照某种规范将数据转换为二进制
为什么要编码?
计算机只能识别0和1,那么使用计算机就必须使用二进制的方式告诉计算机
这是一个复杂的过程,所以需要一种解决的方法让计算机识别人类的语言
字符编码的发展史
1、美国使用Ascii编码表
2、其他的国家也需要使用计算机,于是每个国家都推出自己的编码表
中国-GBK
日本-shift-j
因为每个编码表互补兼容,导致乱码
3、为了统一全世界产生Unicode编码(万国编码)
1、统一全世界的编码
2、必须还兼容之前的GBK、shift-j编码
Ascii:用八个二进制位(一个字节bytes)
1111 1111 2**8=255
GBK:英文字母在GBK中占一个字节
中文占两个字节 16个二进制位 2**16-1=65535
你Y好
1111 1111 1111 1111
如果一个字节的首位为1,表示一个中文
如果一个字节的首位为0,表示一个英文
GBK 不仅仅要存储数据,还要计算每个符号
unicode:无论是英文还是其他字符,都是两个字节
为什么这么设计
1、是为了提高效率,而采取的空间换时间
缺点:
2、浪费硬盘空间,降低网络传输效率
为了解决上述unicode退出UTF-8
utf-8是可变长的
英文占一个字节
中文占三个字节
与GBK相同的是,都需要计算存几个字节,所以不适合内存
使用与:硬盘和网络传输
结论:内存中用unicode,硬盘或网络传输中用utf-8
用户驶入->内存(unicode)->转换为(utf-8)->硬盘 该过程为编码就是字符转换为二进制的过程
硬盘上的a.txt(utf-8的二进制)-> unicode的二进制-查编码表得到符号--显示到屏幕上
该过程称之为解码,把二进制转化为符号
乱码问题?
1、存储是与取出时使用的编码不一致,只要找到正确的编码数据还可以恢复
2、存的时候就已经乱了(文档中的内容超出了采用的编码表的范围),数据将丢失解决方法是用utf-8编码表
如何解决文件乱码问题
python在执行代码之前必须从硬盘加载到内存,硬盘中都是二进制,必须要用UNICODE编码表
name解释器怎么知道你采用的什么编码方式?
如果不明确自定,解释器将采用默认的解码方式,在python3中默认的是UTF-8字符编码,在python2中默认的ASCII码
当你使用pathon中则需要手动指定编码方式 设置文件头 #coding:utf-8
name=u'张全蛋‘
#u 表示将这个变量存储为unicode 编码,可以防止取出变量时乱码
1个16进制=0.5个字节

encode unicode =>utf-8 将Unicode的字符转化为二进制
decode utf-8 ->unicode 将二进制转化为Unicode

文件处理:
文件是什么?
文件是操作系统提供的虚拟概念
文件这个概念的自所以出现是为了简化对硬盘的操作
学习文件处理是为了将数据永久保存

1、打开文件
f=open('test.txt,encoding='utf-8))#是给操作系统一个指令,让操作系统去打开文件,应为应用程序无法直接控制硬盘
2、读取内容
data=f.read()
print(data)

# 使用循环 来读取全部内容 方式1
# with open(r"D:\sh_fullstack_s6\day8\代码\test.txt",mode="r",encoding="utf-8") as f:
# while True:
# line = f.readline()
# if not line: # 如果line为空则表示没有内容了
# print("\n没有内容啦!")
# break
# print(line,end="") # 使用循环 来读取全部内容 方式2
# with open(r"D:\sh_fullstack_s6\day8\代码\test.txt",mode="r",encoding="utf-8") as f:
# for line in f:
# print(line,end="") # 一次性读取全部
# with open(r"D:\sh_fullstack_s6\day8\代码\test.txt",mode="r",encoding="utf-8") as f:
# print(f.readlines()) # 会将每一行放入列表中

3、关闭文件
f.close()
总结:open read close 等都是在给操作系统发送指令
打开文件的语法二:在with 代码执行完毕后会自动调用close
with open('test.txt') as f:
data=f.read()

参数1 文件路径 可以相对,也可以是绝对
mode 打开文件的模式 r(只读)
w(只写)

# 注意在w模式下 一旦打开文件 立即清空原来的内容 如果文件不存在则创建新文件
# 写入字符串时需要手动拼接换行符
with open(r"D:\sh_fullstack_s6\day8\代码\test.txt",mode="w",encoding="utf-8") as f:
f.write("爱根\n")
print(f.writable())
f.writelines("\n".join(["abc","cba","nba"]))
# f.writelines({"name":"bgon","age":20})
pass #
with open("新文件.txt",mode="w")as f:
pass

+(可读可写)了解即可

+ 表示可读可写模式
w+ 清空原文件,如果不存在则创建
r+ 如果不存在则报错
a+ 如果不存在则创建,光标移动到最后
可读可写:可用于文本处理,但对于写别的文件,一般不用,容易造成文件的破坏打不开
Windows默认
读取内容:可以用参数指定要读取的个数,默认为-1表示全部读取
需要注意read(-1)仅限于文件较小时,如果内存过大会造成内存溢出
data=f.read(2000)

读取相关函数
read()读取全部
read(size)读取指定大小
readlines ()读取全部
readline()读一行
readable()判断是否可读

注意在w模式写,一旦打开文件 立即清空原来的文件,如果文件不存在则创建一个新文件

在操作非文本文件时,(读一个图片)必须明确指定模式为字节模式
b 用来指定为字节模式
b必须与r/w连用 rb/wb
注意、
b必须与r/w连用 rb/wb
当模式为字节模式时,不能指定encoding参数
默认情况下,读写文本模式,也就是t模式,同样需要与r/w连用

t模式下python解释器会自动转码解码而b模式不会

当模式为字节模式时单位为字节

在b模式下只能写入字节

print(data)
f.close()
print(f.readable())判断是否可读
print(f.wrireable())判断是否可写

a表示追加写入模式,不会清空原数据,会自动把光标移到最后
with open (r'文件路径’,‘at’(文档模式)/'ab'(b模式),encoding='utf-8')

控制文件的打开模式
r\w\a\+
控制操作文件内容的模式
t\b

t\b必须与打开模式连用
各种组合如下:
rt、wt、at、rb、wb、ab、r+、w+、a+

关于文件操作的常用函数
read
readline
readlines
readable

write
writelines
writeable

关于编码的两个函数
encode 编码
decode 解码

上一篇:【转载】NIO服务端序列图


下一篇:react组件父传子