python(数据分析与可视化)一
本地文件读写
1.读纯文本文件
重点:
(1)相对路径 : 同级./ 父级…/
(2)绝对路径
file = open('./chinase_utf8.txt',mode='r',encoding='utf-8')
content = file.read()
print(content)
file.close()
2.文本编码历史
print(‘中’.encode(encoding=‘gbk’)) -> b’\xd6\xd0’
gbk编码 :一个汉字两个字节
为了节省流量 国内有人仍坚持gbk
‘中’.encode(encoding=‘utf-8’)
对于中文,gbk比utf8节省三分之一的空间
解码: 二进制->自然信息
eg: b’\xd6\xd0’.decode(encoding=‘gbk’)
历史
我们看到的信息,例如一个文字‘中’,存储到电脑中,二进制。物理0-3v3-5v1.
编码 encoding:自然信息‘中’→二进制0101
解码 decoding:二进制→自然信息‘中’
1.上世纪电脑刚刚产生
内存、硬盘非常贵
最小信息单位1字节8bit位二进制1byte=01010101
1000byte 1kb 1000kb=1Mb 1000Mb=1Gb Tb Pb
’a‘->80000001
‘b’->0000010
‘c’->0000011
1byte8位,2的8次方,256种可能
把a-z,A-2,±()$#,把一百多种常见英文字母字符编进去,
发明了编码方式【ascii】
2.上世纪末电脑开始传入其它国家
欧洲,亚洲,中国大陆、中国台湾、日本、韩国
ascii编码无法表达中文。
用2个字节,2的16次方,65535种可能
‘一’ -> 00000000 00000001
‘中’ -> 00000010 00000101
编码常用的2w多种汉字
中国大陆发明编码方式【gbk2312】更新繁体字生僻字【gbk12302】,统称【gbk】
问题是,
中国台湾big5
'我’ -> 00000010 00000101
日本、韩国它们自己的编码方式
00001000101
日本、韩国它们自己的编码方式
每个国家自己一套编码,同样的二进制排列不同解码方式得到不同信息。
3.现代
为了改变上述问题,出现一个协会(类似IEEE、ISO、联合国),把各国代表集中开会
出现了一套大统一的编码,
【unicode】
用4个字节,2的32次方,得到一个非常大的数字,多种可能性,所有国家语言,又称万国码
0300000000000081
统一问题解决,但小代价,占用磁盘多,纯英文信息比 ascii花费4倍空间
但 unicodeascii向下兼容ascii,利用压缩算法可以省略不必要的字节,最终一个字符1-4字节
目前最流行的是【utf-8】。utf-8是 unicode编码的一种具体存储实现方式。
目前都建议使用utf-8.
4.乱码是如何产生的
编码方式和解码方式不一样
3.with语句
文件操作和其他默写操作,共性: 开始前准备,主要逻辑,收尾工作。with语句把开始前准备和收尾工作自动完成
with open('./chinase_utf8.txt',mode='r',encoding='utf8') as f:
content = f.read()
print(content)
4.读非纯文本文件
图片、视频、word文档是windows上有相应解码功能的软件才能预览。
我以读图片为例简单阐述一下我的个人看法:
python作为后端语言,控制台无法直接看到图片的样子,但可以看到二进制排列
#读图片二进制
with open('./cesi.jpg',mode='r+b') as f:
print(f.read())
# 一长串 b'\xff\xd8\xff\xe1 ...'
#mode: rb或r+b b表示二进制模式
5.写非纯文本文件
在这里还是以图片为例,写 就是 读 的逆过程,所以我们首先要做的就是把一个图片的二进制代码赋予一个变量,然后执行读 的逆操作,如图:
img_content_bytes = b'\xff\xd8\xff\xe1\x00\x8eExif\x00\...'
with open('./6daxuexi.jpg',mode='w+b') as f:
f.write(img_content_bytes)
6.base64编码
场景:
- 字符串方式传播图片。
- 简单加密。
- 服务器兼容性。
base64编码作用的是字节
例如 ‘中’ 00000001 00000001
base64 每次取六位前面补两位0,依次类推,得到几个新的字节,比原始信息大三分之一
#整体过程:文本/图片 编码-> 二进制 -> base64 改变后的二进制 -> ascii解码成基本字符
import base64
str1 = '18536496067'
cont_b64_bytes = base64.b64encode(str1.encode(encoding='utf-8'))
print(cont_b64_bytes)
content = cont_b64_bytes.decode(encoding='ascii')
print('我的绿色软件是:',content)
#图片
with open('./6daxuexi.jpg',mode='rb') as f:
content_bytes = f.read()
content_b64_bytes = base64.b64encode(content_bytes)
content_b64_str = content_b64_bytes.decode(encoding='ascii')
print(content_b64_str)
7.base64解码
解码就是编码的逆过程,我下面举个例子:
import base64
#整体过程:文本/图片 编码-> 二进制 -> base64 改变后的二进制 -> ascii解码成基
str1 = 'MTM3MjUxMDc5NjQ='
str2 = 'T3JpZHp1cnU='
str1_bytes = str1.encode(encoding='ascii')
print(str1_bytes)
raw_bytes=base64.b64decode(str1_bytes)
print(raw_bytes)
raw_str=raw_bytes.decode(encoding='utf-8')
print(raw_str)
今天的分享就到这里,如果还想了解更多,可以看我主页!