一.字符编码
运行程序的三大核心硬件:CPU,内存,硬盘
python解释器运行.py文件的三大步骤 :
(1)将python解释器的代码由硬盘读到内存
(2)将.py以普通文本文件形式读到内存的解释器中
(3)python读取文件内容 识别python语法 执行相应操作
ps:普通的文本编辑器与python解释器前两步都是一样的
1.字符编码发展史
ASCII表 :用八位二进制表示一个英文字符 或拉丁文字符
缺点:无法兼容其他字符
GBK: 用2Bytes表示一个中文字符 用1Bytes表示一个英文字符
缺点:无法兼容其他字符
Unicode : 统一用2Bytes表示所有的字符
优点:1.用户在输入的时候,无论输什么字符都能够兼容万国字符
2.其他国家编码的数据由硬盘读到内存的时候unicode与其他各个国家的编码都有对应关系
缺点:1.浪费存储空间
2.io次数增减,程序运行效率降低(致命)
utf-8 : 用3Bytes表示一个中文字符 用1Bytes表示一个英文字符现在的计算机
现在的计算机内存基本采用Unicode编码,硬盘采用utf-8 编码
完美中计算机内存和硬盘应该都采用utf-8 编码
2.编码与解码
encode:数据由内存保存到硬盘 一般是将内存中的unicode格式二进制数字编码(encode)成硬盘中utf-8格式的二进制数据
decode:硬盘中的数据由硬盘读到内存 一般是将硬盘中的utf-8格式的二进制数据 解码(decode)成 内存中unicode格式的二进制数据
乱码 :编码方式和解码方式不一致
ps:不乱码的核心在于文本文件以什么格式的编码,就以什么编码解
3.版本差异
python 2.0
将py文件按照文本文件读入解释器中默认使用ASCII码(因为在开发python2解释器的unicode还没有盛行)
python 3.0
将py文件按照文本文件读入解释器中默认使用utf-8
4.小知识点
文件头
# coding:utf-8
1.因为所有的编码都支持英文字符,所以文件头才能够正常生效(在运行py文件的第二步中执行)
基于Python2解释器开发的软件,只要是中文,前面都需要加一个u
python3中字符串默认就是unicode编码格式的二进制数不用加
ps:pycharm终端用的是utf-8格式;windows终端采用的是gbk
5.总结
可以通过.encode方法把unicode编码成utf-8的二进制数据,方便进行存储和传输。
可以通过.decode方法把将硬盘中的utf-8格式的二进制数据解码成unicode格式的二进制数据
二.文件处理
1.文件三问
(1)什么是文件?
操作系统给用户的一种对硬盘进行操作的一种简单接口
(2)为什么要用文件?
为了在硬盘上永久储存数据
(3)如何用?
f.open()
f.close()
2.打开两种方式
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
f = open(r"a.txt" ,'rt', encoding= "utf-8") print(f.read()) f.close() with open(r"a.txt" ,'rt', encoding= "utf-8") as f : print(f) print(f.read())
open(r'路径', mode = ' ' ,encoding='')
r:转义字符
打开文件推荐在路径前加r
路径分为绝对路径和相对路径。
with open( ) as f :
可以自动关闭系统文件
mode参数不写的话默认是rt
3.打开模式
打开模式有三种 :
(1)r 只读模式
(2)w 只写模式
(3)a 追加写模式
三种模式都可以使用的方法是readable和writeable来判断文件是否可读可写。
r模式 在打开文件的时候 如果文件不存在 直接报错
read方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
with open(r"a.txt" ,'rt', encoding= "utf-8") as f : print(f) print(f.read()) # 一次读取文件的全部内容
readline方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
with open(r"a.txt" ,'rt', encoding= "utf-8") as f : print(f.readline()) print(f.readline()) # 一次读取一行内容
readlines方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
with open(r"a.txt" ,'rt', encoding= "utf-8") as f : print(f.readlines()) # 返回的是一个列表 列表中的一个个元素对应的就是文件的一行行内容 for line in f : print(line) # readlines与for循环类似
w模式
1.文件不存在的情况下 自动创建该文件
2.当文件存在的情况下 会先清空文件内容再写入
write方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
with open(r"xxoo.txt" , 'wt', encoding= "utf-8") as f : f.write("nizhenhao " ) # 向文件中写入字符
writelines方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
l = {"name" : "wanglei", "sex" :"femal"} with open(r"xxoo.txt" , 'wt', encoding= "utf-8") as f : print(f.writelines(l)) # 类似于for循环的遍历
a模式
1.当文件不存在的情况下 自动创建该文件
2.当文件存在的情况下,不清空文件内容, 文件的光标会移动文件的最后
write方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
with open(r"xxoo.txt" , 'at', encoding= "utf-8") as f : print(f.writable()) f.write("nizhenhao " ) # 向文件中写入字符
4.操作单位的方式
操作单位的两种方式
(1)t 文本文件 t在使用的时候需要指定encoding参数 如果不知道默认是操作系统的默认编码
(2)b 字节串 一定不能指定encoding参数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
with open(r"D:PycharmProjectsuntitledvenvday7xxoo.txt" , mode='rb') as f : print(f.read())