day10 字符编码、python2和3的区别、文件的三种打开模式、with管理文件操作

字符编码:

字符编码: 二进制 和 你所能认识的字符 之间的相互转换的一个过程

早期的ascii码

 

中国人的gbk码,4个字节

unicode: 认识万国语言,万国编码

unicode:把 8位的英文变成了16位的英文, 多占用了内存空间,因此产生了utf8码可以节省储存空间

 

出现乱码的情况

编码格式不统一

文本编辑器支持的是utf8 ,你输入的是gbk --> 文件的存储

文件存储用了utf8 ,但是下次打开用了gbk --> 文件的读取

 通俗举例:

中文的文本编辑器只认识中文,然后你输入了日文 --> 乱码 # encode 编码

文本编辑器存储了中文(文件),但是你用日本的编辑器打开这个文件 --> 乱码 # decode 解码

 

如何解决乱码:

什么格式存储, 就什么格式读取 就不会乱码(牢记这句话)

windows电脑的记事本默认为gbk编码,除此之外其他的软件默认编码为utf8

 

 

 

Python2和3的区别:

 

python解释器运行代码的流程

 

1. 启动python解释器(相当于文本编辑器)
2. 打开文件,显示这个字符并检查语法(涉及字符编码, a=1只是一个很普通的字符)
3. 解释字符 (涉及字符编码,再去内存空间 生成一个a=1的变量)

 

第二步python2和python3的区别

 

python2默认是ascii读取字符, python3默认是utf8读取字符,coding:gbk`会告诉python3解释器用gbk编码读取字符

 

 

第三部python2和python3的区别 

Python2(了解)

使用unicode 或者 指定的coding编码(str类型)

 ```python

# coding:gbk
a = '中文' # 用gbk编码存储了这堆0和1
a = u'中文' # 用unicode编码存储了这堆0和1
print(a)
```

 终端是一个文本编辑器,会有默认编码.

假设终端的默认编码是gbk , 认识 gbk编码的变量

假设终端的默认编码是utf8, 不认识 gbk编码的变量

 

 python3(了解)

 

使用unicode

 

```python
# coding:gbk
a = '中文' # 用unicode编码存储了这堆0和1
print(a) # 010101010
```

在终端中看到的其实是unicode,但是终端帮你把这个unicode的0和1做一个转换,

从unicode转换成了终端能够识别的编码格式,然后变成中文

 

假设终端的默认编码是gbk , 认识 unicode编码的变量

 

假设终端的默认编码是utf8,认识 unicode编码的变量

 

 

 

文件的三种打开模式

r模式:

f = open('test.py','r',encoding='utf8') # 只读 # 文件内容拿出来,读一行少一行

print(f.read()) # 读取文件所有内容, 

print(f.readline()) # 读取一行

print(f.readlines()) #读取所有内容,但是是以列表的形式展示

print(f.readable()) # 判断是否可读 # True

f.close()

以后使用这个方式循环文件for i in f:

  print(i)


w模式:
f = open('test.py','w',encoding='utf8') # 只写 # 清空后再写,自动创建列表
lt = ['sdklfj','sdkfjksldf']
res = '\n'.join(lt)
f.write(res) 


 print(f.readable())
print(f.writable()) #判断是否可写
f.writelines(['sdklfj','sdkfjksldf']) #只能以列表的形式
f.close()

a模式:
f = open('test.py','a',encoding='utf8') # 追加 # 文件末追加
f.write('nick handsome') 
f.close()

二进制模式:

文本模式t(默认)
f = open('test.py','rt')
data = f.read()
print(data)


进制模式b(打开图片视频等都需要用到)
f = open('python2和3的字符编码的区别.png', 'rb')
f = open('python2和3的字符编码的区别.png', 'wb')
f = open('python2和3的字符编码的区别.png', 'ab')
data = f.read()
print(data)

fw = open('test.png','wb')  # encoding是为了让二进制代码变成文本所需要的,所以b模式不需要encoding
fw.write(img)

 

with管理文件操作
with open('test1.png','wb') as fw: # 自动关闭文件
fw.write(img)

with open('test.py', 'rt', encoding='utf8') as fr2, \
open('test.txt', 'rt', encoding='utf8') as fr1, \
open('test.png', 'rb') as fr3:
data1 = fr1.read()
print('data1', data1)
data2 = fr2.read()
print('data2', data2)
data3 = fr3.read()
print('data3', data3)

反斜杠用来表示所属同一行
print('skdfjlllllllsfsdfsdfskdfjlllllllsfsdfsdfskdfjlllllllsfsdfsdfskdfjlllllllsfsdfsdfskdfjlllllllsfsdfsdfskdfjll\
英')

 

 

 

上一篇:中山Day10——普及


下一篇:Spring中的JdbaTemplate