字符编码,文件处理

软件启动的流程
打开notepad++ 来查看test.txt文档
1.从硬盘将软件程序加载到内存中
2.加载test.txt到内存中
3.执行notepad的代码将test.txt的内容输出到屏幕上

python解释器也是一个应用软件
1.从硬盘将解释器加载到内存中
2.加载test.py到内存中
3.解释器解析python语法



文本编辑器与解释器在打开同一个py文件时
前两个阶段是一致的,仅仅是第三个阶段不同


什么是字符编码?字符编码表
编码,按照某种规范 将数据转换为二进制
为什么要编码?
计算机只能识别0/1,那么要使用计算机则必须将所有的数据和命令都用二进制表示
这是一个复杂的过程,所以需要一种解决方案,可以让计算机识别人类的语言

字符编码的发展史
美国人发明了计算机,需要让计算机识别美国人的语言,所以诞生了asc编码表
其他的国家也需要使用计算机,于是每个国家都推出了自己的编码表
中国-GBK
日本-shift-j
因为每个编码表互不兼容,导致乱码问题
为了统一全世界的编码 推出而unicode编码
1.统一全世界的编码
2.必须还兼容之前的GBK,shift-j

ASCII 中用八个二进制(1个bytes)一个字符占一个字节

GBK 英文字母占一个字节
中文占两个字节
16个二进制 2**16-1=65535
如果一个字节的首位为1 表示一个中文
若果一个字节的首位为0 表示一个英文
GBK不仅仅要存储数据 还要计算每一个符号占的长度

unicode 无论英文还是其他字符 都是2个字节
为什么这么设计?不浪费空间?
1.为了提高效率,而采取的空间换时间(效率)
unicode的问题
浪费空间,降低网络传输效率

为了解决上述unicode的问题、:推出了UTF-8
utf-8是变长的
英文占一个字节
中文占三个字节
生僻字占更多字节

与GBK相同的是,都需要计算,所以不适用于内存
适用于:硬盘和网络传输
utf-8 使用场景
1.当我们需要将数据基于网络进行发送时则必须将数据转成二进制
2.当你需要将数据从内存写到硬盘也推荐使用UTF-8

结论就是 内存中用unicode,硬盘或网络中用UTF-8

用户输入->内存(unicode)->转换成(utf-8)->硬盘 该过程称之为编码 就是字符转为二进制的过程
硬盘上的a.txt(utf-8的二进制)-> 内存中unicode的二进制—>查编码表得到符号->显示到屏幕上
该过程称之为解码 把二进制转为符号

乱码问题?*******
1.存储时与取出时使用的编码方式不一致
2.乱码不仅仅是因为存和取的编码不同,还可能是存的时候就已经乱了,这将导致数据流失!
所以存的时候一定要注意:
所使用的编码方式一定要支持文档中的所有内容,即utf-8

python在执行代码之前必须从硬盘加载代码到内存,而硬盘中都是二进制数据,必须先解码为unicode
那解释器怎么知道拟采用的什么编码方式?
如果不明确自定 解释器将采用默认的解码方式,在python3中默认为utf-8而python2中默认为ASC
当你使用的是py2的时候 则需要手动制定编码方式,在文档的第一行写上 coding:uft-8
coding:uft-8

解释器在读取py文件后需要识别语法 当定义字符串编码时又涉及到编码问题
py2默认采用asc 也可以使用coding来指定 但也有乱码的可能
当coding为gbk 而输出字符时采用utf-8
py3中默认就是unicode 别切coding也只能修改前两阶段解码过程,无法修改定义变量的编码

py2中当从内存访问变量时可能会乱码,例如存储时utf-8的字符但是输出时 却用了GBK
python2中u 表示 将这个变量存储为unicode编码 可以防止取出变量时乱码
数据类型也变为了unicode
1个16进制 = 0.5个字节
*****
encode: unicode->uft-8 将unicode的字符 转为自定的二进制
decode: utf-8 ->unicode 将二进制转为unicode

encode使用场景*****
1.需要文本写入到硬盘
2.需要将将文本基于网络发送时

文件处理:

文件是什么?
文件是操作系统提供的一套虚拟概念
文件这个概念之所以出现 是为了简化对硬盘的操作
一个文件就代表硬盘上的一段二进制数据

学习文件处理是为了将数据永久保存

打开文件的语法1
1.打开文件
f=open('test.txt',encoding='utf-8')#是给系统发送了一个指令,让操作系统去打开文件,因为应用程序无法直接控制硬件

2.读取内容
data=f.read()
print(data)

3.关闭文件 不要忘记关闭
f.close()

open close read等都是在给操作系统发送指令

打开文件的语法2: 在with代码执行完毕后会自动调用close
with open ('test.txt',encoding='utf-8') as f:
data= f.read()
print(data)

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

+(可读可写)了解即可
+ 表示可读可写
w+ == w+t 打开就清空 所以读不到 清空源文件如果不存在则创建
r+ == r+t 如果不存在则报错
a+ == a+t 打开就移动光标到末尾 也读不到 如果不存在则创建,光标移动到最后
可读可写 可用于文本处理 但是对于写别的文件,一般不用,很容易造成文件损坏

encoding 编码方式 windows默认为GBK Linux默认为utf-8

读取内容 可以用参数指定要读取的个数,默认为-1 表示全部读取
需要注意 read(-1)仅限于文件较小时,如果文件太大会造成内存溢出
data=f.read(2000)
f.readable() 判断是否可读
f.writable()判断是否可写
line=f.readline()

使用循环 来读取全部内容1
with open(r'D:\ \ \ ,encoding='utf-8') as f:
while True:
line = f.readline()
if not line:#如果line为空则表示没有内容了
break
print(line,end='')
使用循环 来读取全部内容2
with open(r'D:\ \ \ ,encoding='utf-8') as f:
for line in f:
print(line,end='')

使用循环 来读取全部内容3
#一次性读取全部
with open(r'D:\ \ \ ,encoding='utf-8') as f:
print(f.readlines())#会将每行放入列表中

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

注意在W模式写 一旦打开文件 立即清空原来的内容 如果文件不存在则创建新文件
写入字符串时需要手动拼接换行符
with open(r'D:\ \ \ ,mode='w',encoding='utf-8') as f:
f.write('矮跟')
f.writelines('\n'.join(....))
b:
在b模式只能写入字节

可读可写字节模式
r+b 直接写入 会把原数据覆盖掉
w+b 打开就清空 所以读不到
a+b 打开就移动光标到末尾 也读不到
仅仅单位不同

在操作非文本文件时,必须明确指定为字节模式
b 用来指定为字节模式
注意:
b 必须与r\w连用 rb(readBytes)\wb(writeBytes)
当文件为字节模式时 不能指定encoding参数!

默认情况下时读写文本模式 也就是t模式同样需要与r\w连用
rt(readText)\wt(writeText)
t模式下 python解释器会自动进行编码和解码而b模式不会

当模式为字节模式时(rb)单位为字节
#循环读取全部内容

with open('xxx.png',mode='rb') as f:
while True:
data = f.read(1024)
if not data:#如果data为空则意味着文件读完了
break
print(data)





追加写入: a 表示追加写入 不会清空原数据 会把光标移动到最后
a和w都是写入模式 如果文件不存在都会创建新文件
不同的是 w会清空源文件 a不会清空且会将光标移动到文件额末尾

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

t\b 必须与打开模式连用
各种组合如下:
rt wt at
无若是读还是写 都需要指定编码方式,如果不指定 windows默认为GBK linux默认utf-8
操作系统都是字符为单位
rb wb ab r+ w+ a+

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

write
writelines
writeable

关于编码的两个函数
encode 编码
decode 解码
posted @ 2019-01-07 16:33  777ijBGly-  阅读(172)  评论(0编辑  收藏  举报