base64模块真正用的上的方法只有8个,分别是encode, decode, encodestring, decodestring, b64encode,b64decode, urlsafe_b64decode,urlsafe_b64encode。他们8个可以两两分为4组。
encode,decode一组,专门用来编码和解码文件的,也可以StringIO里的数据做编解码;
encodestring,decodestring一组,专门用来编码和解码字符串; (Python3 已弃用)
b64encode和b64decode一组,用来编码和解码字符串,并且有一个替换符号字符的功能;
b64encode(s, altchars=None)
base64.b64encode('房间')
base64.b64encode('房间', altchars='-_')
base64.b64decode(s, altchars=None)
base64.b64decode('5oi/6Ze0')
base64.b64decode('5oi_6Ze0', altchars='-_')
这个功能是这样的:因为base64编码后的字符除 了英文字母和数字外还有三个字符 + / =, 其中=只是为了补全编码后的字符数为4的整数,而+和/在一些情况下需要被替换的,b64encode和b64decode正是提供了这样的功能。至于什 么情况下+和/需要被替换,最常见的就是对url进行base64编码的时候。
urlsafe_b64encode和urlsafe_b64decode一组,这个就是用来专门对url进行base64编解码的。实际上也是调用的前一组函数。
The alphabet 使用 '-' 代替 '+', 使用 '_' 代替 '/'.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import base64
string = 'Hello World!'
base64_string = "SGVsbG8gV29ybGQh"
# unicode -> utf-8
bytesString = string.encode(encoding="utf-8")
# base64 编码
data = base64.b64encode(bytesString)
# utf-8 -> unicode
print(data.decode('utf-8'))
# unicode -> utf-8
bytesString = base64_string.encode(encoding="utf-8")
# base64 解码
data = base64.b64decode(bytesString)
# utf-8 -> unicode
print(data.decode('utf-8'))
file_in = r"file_in.txt"
file_out = r"file_out.txt"
with open(file_in, 'rb') as fin, open(file_out, 'wb') as fout:
base64.encode(fin, fout)
base64_in = r"base64_in.txt"
base64_out = r"base64_out.txt"
with open(base64_in, 'rb') as fin, open(base64_out, 'wb') as fout:
base64.decode(fin, fout)
img_file_in = r'./img_base64_in.png'
with open(img_file_in, 'rb') as f:
bytesString = f.read()
# base64 编码
data = base64.b64encode(bytesString)
# utf-8 -> unicode
print(data.decode('utf-8'))
import base64
img_base64_in = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADCklEQVQ4jXWTTWhUdxTFz/3/33w2CdNMQkMaqfmAGqziIiRtESutkqKgmEUJootSKF0I4kK3ChoUa6ltLWiRbrqsUlsrWlMVP6K2BCtBtDZ+JdFM6ryYmHHezHsv754uEo2bXjhwuPdyFgd+INlNMkcympFyRqTqnOfsZu6POZLdIOnOniKSOjEZ6ZZted25x6WqMjcW8tNNYzxwcEJnMl+EkKSLWRP5gep0RN23/4lW1d1hdt4d9l3x+MXX40xnB1nffI/nL3o6Pa0ahnMhBoCSkHhMxBrI4N1AMhnLRELwKBfCdSNkaywI4fBIKNaKOA6EhABQo6pGhPLTLwUc/fkZutZWUEQlU2XR0ZZCR3sKnqdoabayZHGCh76fRP81HyIUVTUgqRf7PK1ruqfVDXf15OkCb94q88FQ8KK6a9dLfJwPuXOPSyczqG8vH9G8GypJNQDk+kBZrIFUVYqcu1BC64IEnhUVm7fmsb3HRUtTDLU1FuculNDc6EhuLJTb/wQCQBySaG9LIpEAxp8o3luawtBwgM41oyiVCWuBP/t9HP+xHu1tSXz5zQSWvpNC64I4lAqJoojGCK78UYYfEIsWxrG6axRNjTEYI+i7WkLgEx91VaBnRxanz5SwZHEc89+IQRUQVaUqYa3B8EiI9R+PYWg4xA+HX8NfAz6+/W4Kla8YeCXFyg/S2L+3Fo4VRJHCGIEhhdYa/n074IrVo1z1YRqXfm/AorcSKEwRh76qRUWFYN/uGjwYCrFq3SgLBaUxhoDQqKoAlAMHJyWdhmz6LMNlnQ9x7HgRmVcNkklB3lWEIfB6XYyXLnvSe7YoIpQoUjHGGAUArww+nSLv3w9l765arnw/Bb9MKIHPe7J4tyNJpYq1loUCCQggojIdkdZAfz1ZlI2f/IuGBgdda9JiLXCq10MsZtC5IgXPI44cK9IY4MTRejTOj5GEEZIugCyg6D1b5onfiggDoKXZkdY34/B9YuCGj4ePIlZXW2zorsTCVkcAAwDjeI7zDI0vo/t/o8/JzZHs/g8akjdG32H2lQAAAABJRU5ErkJggg=="
# unicode -> utf-8
bytesString = img_base64_in.encode(encoding="utf-8")
# base64 解码
data = base64.b64decode(bytesString)
# 使用 matplotlib 展示图片
import matplotlib.pyplot as plt # plt 用于显示图片
import matplotlib.image as mpimg # mpimg 用于读取图片
# 读取BytesIO字节流
from io import BytesIO
bytes_stream = BytesIO(data)
lena = mpimg.imread(bytes_stream)
plt.figure(figsize=(1, 1))
plt.imshow(lena) # 显示图片
plt.title('title')
plt.axis('off') # 不显示坐标轴
plt.show()