字符编码,文件处理

今日学习内容,字符编码。

首先复习一下运行文件的基本操作:

计算机的三个核心组件:CPU、内存、硬盘。

任何一个程序要想运算,必选先有硬盘加载到内存,然后cpu去内存取指执行,运行着的应用程序产生的数据,必先存在内存。

然后是回顾了python解释器运行一个py文件(如xxx.py)的步骤:

1、将python解释器的代码由硬盘读到内存。

2、将xxx.py以普通文本文件形式读到内存。

3、python读取文件内容,识别python语法,执行相应的操作。

(普通的文本编辑器与python解释器的前两步是一样的)

字符编码

今天学习的新内容是字符编码,字符编码针对文字,字符编码只跟文本文件有关。

人在操作计算机的时候输入的是人能够看懂的字符,但是计算机只能识别0101010这样的二进制数据。输入的流程是输入字符>>>字符编码表(字符编码表就是字符与数字的对应关系)>>>二进制数字。

字符编码的发展史以及分类

第一个阶段

计算机由美国人发明,所以最早的字符编码为ASCII。

第二个阶段

中国规定的GBK编码。

日本人规定的Shift_JIS编码。

韩国人规定的Euc-kr编码。

第三个阶段

unicode万国码(能包括全世界的语言)。

为了可以节省unicode耗费空间的UTF-8编码。

结果:内存中统一采用unicode,浪费空间换区可以转换成任意编码(乱码),硬盘采用utf-8,保证存放于硬盘或者基于网络传输的数据量很小,提高传输效率与稳定性。

unicode的两个特点
1.用户在输入的时候,无论输什么字符都能够兼容万国字符
2.其他国家编码的数据由硬盘读到内存的时候unicode与其他各个国家的编码都有对应关系

存取过程中的数据变换:

数据由内存保存到硬盘
1.内存中的unicode格式二进制数字 >>>>编码(encode)>>>>> utf-8格式的二进制数据
硬盘中的数据由硬盘读到内存
1.硬盘中的utf-8格式的二进制数据 >>>>>解码(decode)>>>>> 内存中unicode格式的二进制数据

乱码:字符不能够正常显示 (编码不一致)

保证不乱码的关键在于文本文件以什么编码就用什么解码。

python2
将py文件按照文本文件读入解释器中默认使用ASCII码(因为在开发python2解释器的unicode还没有盛行)
python3 
将py文件按照文本文件读入解释器中默认使用utf-8

 

基于Python解释器开发的软件,只要是中文,前面都需要加一个u
在python2中,当你不指定文件头的时候,默认用ASCII存储数据,如果指定文件头那么就按照文件头的编码格式存储数据。python3中字符串默认就是unicode编码格式的二进制数。

补充点:1.pycharm终端用的是utf-8格式。2.windows终端采用的是gbk。

x = ''
res1 = x.encode('gbk')  # 将unicode编码成可以存储和传输的utf-8的二进制数据
print(res1)  # b'\xe4\xb8\x8a'
# bytes类型  字节串类型  你就把它当成二进制数据即可
res2 = res1.decode('gbk')  # 将硬盘中的utf-8格式的二进制数据解码成unicode格式的二进制数据
print(res2)
 你a他
1Bytes|1Bytes|1Bytes|1Bytes|1Bytes|1Bytes|1Bytes  
1+7bit|1+7bit|1+7bit|1+7bit|1+7bit|1+7bit|1+7bit  # 每个Bytes真正的有效位数是7位,而首位是一个标志位。

 

文件处理

什么是文件?操作系统提供给用户操作复杂硬件(硬盘)的简易接口。

为什么要操作文件?人或者应用程序需要永久的保存数据。

怎么使用?

#1. 向操作系统发送请求,打开某个文件(应用程序要想操作计算机硬件 必须通过操作系统来简介的操作)
f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r
#2. 向操作系统发请求 读取文件内容
f.read()
#3. 告诉操作系统 关闭打开的文件
f.close()

 

with open

with open(r'D:\Python项目\day07\a.txt',encoding='utf-8') as f ,\

 

可以自动帮你调用f.close()

文件打开的模式

 r   只读模式

 w   只写模式   

 a   追加写模式

print(f.readable())  # 是否可读
print(f.writable())  # 是否可写
print(f.read())  # 一次性将文件内容全部读出

 

补充:文件路径可以写相对路径,但是需要注意该文件必须与执行文件在同一层文件下。

r模式在打开文件的时候,如果文件不存在,则直接报错

with open(r'a.txt',mode='r',encoding='utf-8') as f:  mode关键字可以不写
print(">>>1:")
print(f.read())  # 一次性将文件内容全部读出
print('>>>2:')
print(f.read())  # 读完一次之后 文件的光标已经在文件末尾了,再读就没有内容了可读
print(f.readlines())  # 返回的是一个列表  列表中的一个个元素对应的就是文件的一行行内容,内部相当于一个for循环。
print(f.readline())  # 只读取文件一行内容
  

w模式需要慎用

1、文件不存在的情况下,自动创建该文件。

2、文件存在的情况下,先清除文件内容,再写入。

with open(r'xxx.txt',mode='w',encoding='utf-8') as f:  # 当文件xxx.txt不存在时,会生成一个该文件。
   print(f.readable())  # 是否可读
   print(f.writable())  # 是否可写
   f.write('不不不,你没有翻~\n')  # write是用来写入内容的,\n是用来换行的。
   l = ['不sdffs,sdfs有翻~\n','不sdfsdf不,你sdfsf翻~\n','不sfad不,你没sa翻~\n']
   f.writelines(l)  # writeliens的作用是,写入列表l中的所有内容,内部原理也是一个for循环

 

a模式

1.当文件不存在的情况下 自动创建该文件

2.当文件存在的情况下,不清空文件内容, 文件的光标会移动文件的最后

with open(r'yyy.txt',mode='a',encoding='utf-8') as f:
    f.write('我是小尾巴\n')

 

操作文件单位的方式
t 文本文件 t在使用的时候需要指定encoding参数 如果不知道默认是操作系统的默认编码
b 二进制 一定不能指定encoding参数

posted @ 2019-07-07 20:55  小肥海  阅读(187)  评论(0编辑  收藏  举报