各种转码(bytes、string、base64、numpy array、io、BufferedReader )
bytes 与 string 之间互转
Python3 最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分。文本总是 Unicode,由str类型表示,二进制数据则由 bytes 类型表示。Python3 不会以任意隐式的方式混用 str 和 bytes,正是这使得两者的区分特别清晰。不能拼接字符串和字节包,也无法在字节包里搜索字符串(反之亦然),也不能将字符串传入参数为字节包的函数(反之亦然)
b1=b'sdf'
s1='sag'
print(type(b1),type(s1))#<class 'bytes'> <class 'str'>
# bytes按utf8的方式解码成str
b2=b1.decode('utf8') # str按utf8的方式编码成bytes
s2=s1.encode('utf8')
base64 转码
import base64 with open("img.png", "rb") as f:
# b64encode是编码,b64decode是解码
base64_data = base64.b64encode(f.read()) print(base64_data)
r = base64.b64decode(base64_data)
print(type(r), r)
f.close()
bytes 转成 numpy array
import cv2
import numpy as np b = b'aaaaaaaaa' # bytes image_array1 = np.frombuffer(b, dtype=np.uint8) # numpy array img_decode = cv2.imdecode(image_array1, 1) # 效果等同于cv2.imread()
BytesIO 和 StringIO
Python3 中 BytesIO 和 StringIO 最大的优势就是可以将读写的操作在内存中进行,相对于磁盘级别的 IO 既省了时间也省了出错的概率
StringIO
from io import StringIO
f = StringIO()
f.write('hello') # 内存级别写入操作
print(f.getvalue()) # 得到文件内容(相当于磁盘IO操作的read()) # 也可以用一个str初始化StringIO,然后,像读文件一样读取:
from io import StringIO
f = StringIO('Hello!\nHi!\nGoodbye!')
while True:
s = f.readline()
if s == '':
break
print(s.strip())
'''
Hello!
Hi!
Goodbye!
'''
BytesIO
StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO,BytesIO实现了在内存中读写bytes
from io import BytesIO
f = BytesIO()
f.write('中文'.encode('utf-8'))
print(f.getvalue()) # b'\xe4\xb8\xad\xe6\x96\x87'
# 写入的不是str,而是经过UTF-8编码的bytes。 # 和StringIO类似,可以用一个bytes初始化BytesIO,然后,像读文件一样读取:
from io import BytesIO
f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
f.read() # b'\xe4\xb8\xad\xe6\x96\x87'
注意指针问题
.getvalue() 可以查看整个输入后的情况 .write() 的初始位置是 0,输入多少后到多少位,直接构造之后初始位置不变还是0 .seek() 是直接去某个 position .tell()可以查看当前位置 .read()读取完指针位置自动到末尾
f=StringIO('abc')
f.read() #返回'abc'
f.read() #返回'' 因为使用过一次read之后指针会发生移动
f.getvalue() #返回'abc' 因为getvalue不受指针影响 f=StringIO('')
f.write('abc')
f.read() #返回'' 因为write已经使指针发生了移动
f.getvalue() #返回'abc' 因为getvalue不受指针影响
f.seek(0) #解决方法:用seek将指针归零
f.read() #返回'abc'
BufferedReader
BufferedReader 可以将 postman 传递的 Filestorage 类型的数据转换成 BufferedReader 类型,之后就可以转换成 numpy array,进行 cv2 的操作
from io import BufferedReader img = request.file.get('xxx') # 假设postman传了图片到服务端,服务端接收到后为img # 转成BufferedReader格式
img_buff = BufferedReader(img) # 得到byte数据
img_byte = BufferedReader.read(img_buff ) # 转成numpy数组
nparr = np.frombuffer(img_byte , dtype=np.uint8) # 转成cv2.imread相同效果的数据
img_decode = cv2.imdecode(nparr, 1)
print(img_decode.shape)
各种转码(bytes、string、base64、numpy array、io、BufferedReader )的更多相关文章
- Python Numpy Array
Numpy 是Python中数据科学中的核心组件,它给我们提供了多维度高性能数组对象. Arrays Numpy.array dtype 变量 dtype变量,用来存放数据类型, 创建数组时可以同 ...
- python2/3中 将base64数据写成图片,并将图片数据转为16进制数据的方法、bytes/string的区别
1.python2将base64数据写成图片,并将数据转为16进制字符串的方法 import binascii img = u'R0lGODlhagAeAIcAAAAAAAAARAAAiAAAzABE ...
- JDK源码学习--String篇(-)
工作三年了,用了三年的JAVA,突然发现竟然没有好好的看下JDK的源码,整天用着的String,只是大概知道怎么回事,其中的实现逻辑却是一头雾水. 知耻而后勇,加油!!! java.lang.Stri ...
- java基础进阶一:String源码和String常量池
作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/8046564.html 邮箱:moyi@moyib ...
- C#中使用Buffer.BlockCopy()方法将string转换为byte array的方法:
public static void BlockCopy(Array src, int srcOffset, Array dst, int dstOffset, int count); 将指定数目的字 ...
- JDK1.8源码之String
一.String类型 引用博文连接: https://blog.csdn.net/ylyg050518/article/details/52352993 一.成员变量 //用于存储字符串 priva ...
- Java源码之String
本文出自:http://blog.csdn.net/dt235201314/article/details/78330377 一丶概述 还记得那会的“Hello World”,第一个程序,输出的Str ...
- 创建 numpy.array
# 导包 import numpy as np numpy.array nparr = np.array([i for i in range(10)]) nparr # array([0, 1, 2, ...
- JDK源码之String类解析
一 概述 String由final修饰,是不可变类,即String对象也是不可变对象.这意味着当修改一个String对象的内容时,JVM不会改变原来的对象,而是生成一个新的String对象 主要考虑以 ...
随机推荐
- 遗传算法介绍并附上Python代码
之前介绍过遗传算法,参见:https://www.cnblogs.com/LoganChen/p/7509702.html 我们用Python实现同样的问题解答. y=10*sin(5*x)+7*ab ...
- 201671030110姜佳宇实验十四 团队项目评审&课程学习总结
作业 链接 作业所属课程 西北师范大学软件工程 作业要求 实验十四 团队项目评审&课程学习总结 作业目标 总结学习心得 本学期课程学习总结 解决实验一 软件工程准备任务5提出的问题: 问题一 ...
- 同时引入依赖:spring-cloud-starter-gateway 和 spring-boot-starter-web,报错
报错: 2019-09-19 11:19:21.437 WARN 72057 --- [ main] GatewayClassPathWarningAutoConfiguration : ****** ...
- 学习Java书籍推荐和面试网站推荐
一.Java书籍推荐: 来自http://www.importnew.com/26932.html 1. 鸟哥的Linux私房菜—基础学习篇 3. Effective Java 6. Java并发编程 ...
- ### Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: ORA-02291: 违反完整约束条件 (SSM.SYS_C0011830) - 未找到父项关键字
在向Oracle数据库里面插入数据时发生了以下错误 ; ]; ORA-: 违反完整约束条件 (SSM.SYS_C0011830) - 未找到父项关键字 ; nested exception : 违反完 ...
- VSCode 如何操作用户自定义代码片段
自己写了一些根据自己习惯弄成的自定义代码片段,不喜跳过 很简单,快速过一下,F1,然后输入 snippets vue代码片段 { // Place your snippets for vue here ...
- Arduino OV7670 live image over USB to PC
https://www.youtube.com/watch?v=L9DTW1ulsT0 https://www.youtube.com/watch?v=Dp3RMb0e1eA
- PHP字符串比较函数详解
在PHP中,对于字符串之间的比较有很多种方法,第一种是使用 strcmp()函数和 strcasecmp()函数按照字节进行比较,第二种是使用 strnatcmp()函数按照自然排序法进行比较,第三种 ...
- I2c理解
1.IIc是什么: 是飞利浦公司设计的一种用于mcu与外围设备之间信息交互的一种协议.高速IIC总线一般可大400kbs 2.IIC作用: 用于mcu与外围设备间信息交互. 3.IIc由什么组成: 由 ...
- SQL注入学习
本次实验环境用的是Xampp,搭建的sqli-labs 配置环境: 下载路径https://github.com/Audi-1/sqli-labs,下载源代码,将解压好的文件夹放在xampp\htdo ...