字符编码及文件操作

字符编码

字符编码的起源:

  

计算机由美国人发明,最早的字符编码为ASCII,只规定了英文字母数字和一些特殊字符与数字的对应关系。最多只能用 8 位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256 个符号

当然我们编程语言都用英文没问题,ASCII够用,但是在处理数据时,不同的国家有不同的语言,日本人会在自己的程序中加入日文,中国人会加入中文。

而要表示中文,单拿一个字节表表示一个汉子,是不可能表达完的(连小学生都认识两千多个汉字),解决方法只有一个,就是一个字节用>8位2进制代表,位数越多,代表的变化就多,这样,就可以尽可能多的表达出不通的汉字

所以中国人规定了自己的标准gb2312编码,规定了包含中文在内的字符->数字的对应关系。

日本人规定了自己的Shift_JIS编码

韩国人规定了自己的Euc-kr编码(另外,韩国人说,计算机是他们发明的,要求世界统一用韩国编码,但世界人民没有搭理他们)

这时候问题出现了,精通18国语言的小周同学谦虚的用8国语言写了一篇文档,那么这篇文档,按照哪国的标准,都会出现乱码(因为此刻的各种标准都只是规定了自己国家的文字在内的字符跟数字的对应关系,如果单纯采用一种国家的编码格式,那么其余国家语言的文字在解析时就会出现乱码)

所以迫切需要一个世界的标准(能包含全世界的语言)于是unicode应运而生(韩国人表示不服,然后没有什么卵用)

ascii用1个字节(8位二进制)代表一个字符

unicode常用2个字节(16位二进制)代表一个字符,生僻字需要用4个字节

例:

字母x,用ascii表示是十进制的120,二进制0111 1000

汉字已经超出了ASCII编码的范围,用Unicode编码是十进制的20013,二进制的01001110 00101101

字母x,用unicode表示二进制0000 0000 0111 1000,所以unicode兼容ascii,也兼容万国,是世界的标准

这时候乱码问题消失了,所有的文档我们都使用但是新问题出现了,如果我们的文档通篇都是英文,你用unicode会比ascii耗费多一倍的空间,在存储和传输上十分的低效

本着节约的精神,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间

现在的计算机:内存都是unicode,硬盘都是utf-8的编码格式

unicode有两个特点:

  1.用户在输入的时候,无论输什么字符都能够兼容万国字符

  2.其他国家编码的数据由硬盘读到内存的时候unicode与其他各个国家的编码都有对应关系

在编码方面python2和python3之间的区别

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

python3
将py文件按照文本文件读入解释器中默认使用utf-8

文件头的作用:

基于python解释器开发的软件,只要是中文,前面都需要加一个u

为了的就是将python2(当你不指定文件头的时候,默认用ASCII存储数据,如果指定文件头那么就按照文件头的编码格式存储数据)

保证不乱码的根本在于文本文件以什么编码编的就以什么编码解

在python中的编码解码

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

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

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

文件操作

打开文件的操作

with open(r'文件路径',打开文件的模式,编码格式) as f

文件的打开模式

r  #只读模式
w  #只写模式
a  #追加写模式

操作文件单位的方式

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

对文件操作的方法

f.read()
f.write()
f.close()
f.readable()
f.writable()
f.readline()
f.readlines()
#mode参数,可以不写,不写的话默认是rt模式,制度的文本文件,t不写默认就是t
with open(r'a.txt',mode='r',encoding='utf-8') as f:
    print(f.readable())  # 是否可读
    print(f.writable())  # 是否可写
    print(f.read())  # 一次性将文件内容全部读出

r模式

#r模式再打开文件的时候,如果文件不存在,会报错
#文件路径可以写相对路径,也可以写绝对路径,写相对路径需要注意改文件必须与执行文件在同一层文件下
with open(r'a.txt',mode='r',encoding='utf-8') as f: with open(r'a.txt','r',encoding='utf-8') as f1: mode关键字可以不写 print(f.readable()) # 是否可读 print(f.writable()) # 是否可写 print(">>>1:") print(f.read()) # 一次性将文件内容全部读出 print('>>>2:') print(f.read()) # 读完一次之后 文件的光标已经在文件末尾了,再读就没有内容了可读 print(f.readlines()) # 返回的是一个列表 列表中的一个个元素对应的就是文件的一行行内容 for line in f: # f可以被for循环 每for循环依次 读一行内容 print(i) # 这个方法 就可以解决大文件一次性读取占用内存过高的问题 print(f.readline()) # 只读取文件一行内容

w模式

#文件不存在的情况下,自动创建该文件
#当文件存在的情况下,会先清空文件内容再写入(w模式慎用)
with open(r'xxx.txt',mode='w',encoding='utf-8') as f: print(f.readable()) # 是否可读 print(f.writable()) # 是否可写 f.write('不不不,你没有翻~ ') f.write('不不不,你没有翻~ ') l = ['不sdffs,sdfs有翻~ ','不sdfsdf不,你sdfsf翻~ ','不sfad不,你没sa翻~ '] f.writelines(l) # 上下等价 for i in l: f.write(i)

a模式

#当文件不存在的情况下,自动创建该文件
#当文件存在的情况下,不清空文件内容,文件的光标会移动到文件的最后
with open(r'yyy.txt',mode='a',encoding='utf-8') as f: print(f.readable()) # 是否可读 print(f.writable()) # 是否可写 f.write('我是小尾巴 ')

rb模式

with open(r'1.jpg','rb') as f
原文地址:https://www.cnblogs.com/chengzige/p/11140551.html