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 )的更多相关文章

  1. Python Numpy Array

    Numpy 是Python中数据科学中的核心组件,它给我们提供了多维度高性能数组对象. Arrays Numpy.array   dtype 变量 dtype变量,用来存放数据类型, 创建数组时可以同 ...

  2. python2/3中 将base64数据写成图片,并将图片数据转为16进制数据的方法、bytes/string的区别

    1.python2将base64数据写成图片,并将数据转为16进制字符串的方法 import binascii img = u'R0lGODlhagAeAIcAAAAAAAAARAAAiAAAzABE ...

  3. JDK源码学习--String篇(-)

    工作三年了,用了三年的JAVA,突然发现竟然没有好好的看下JDK的源码,整天用着的String,只是大概知道怎么回事,其中的实现逻辑却是一头雾水. 知耻而后勇,加油!!! java.lang.Stri ...

  4. java基础进阶一:String源码和String常量池

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/8046564.html 邮箱:moyi@moyib ...

  5. C#中使用Buffer.BlockCopy()方法将string转换为byte array的方法:

    public static void BlockCopy(Array src, int srcOffset, Array dst, int dstOffset, int count); 将指定数目的字 ...

  6. JDK1.8源码之String

    一.String类型 引用博文连接:  https://blog.csdn.net/ylyg050518/article/details/52352993 一.成员变量 //用于存储字符串 priva ...

  7. Java源码之String

    本文出自:http://blog.csdn.net/dt235201314/article/details/78330377 一丶概述 还记得那会的“Hello World”,第一个程序,输出的Str ...

  8. 创建 numpy.array

    # 导包 import numpy as np numpy.array nparr = np.array([i for i in range(10)]) nparr # array([0, 1, 2, ...

  9. JDK源码之String类解析

    一 概述 String由final修饰,是不可变类,即String对象也是不可变对象.这意味着当修改一个String对象的内容时,JVM不会改变原来的对象,而是生成一个新的String对象 主要考虑以 ...

随机推荐

  1. 关于子类和父类中的this的用法

    public class Demo { public static void main(String[] args) { Fu f = new Zi(); f.show(); } } class Fu ...

  2. PAT 乙级 1004.成绩排名 C++/Java

    1004 成绩排名 (20 分) 题目来源 读入 n(>)名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式: 每个测试输入包含 1 个测试用例,格式为 第 1 行 ...

  3. sublime设置默认字体样式

    因电脑配置的不同,还有个人喜好的不同,有时候想用自己喜欢的字体来写代码,想用自己习惯的字号大小来显示代码.这些又该怎样设置呢? 本节主要介绍下如何设置字体大小和样式 (1)点菜单栏 “Preferen ...

  4. Spring Cloud Stream 知识点

    发布-订阅模式 在Spring Cloud Stream中的消息通信方式遵循了发布-订阅模式,当一条消息被投递到消息中间件之后,它会通过共享的Topic主题进行广播,消息消费者在订阅的主题中收到它并触 ...

  5. 29、Python程序中的进程操作(multiprocess.process)

    一.multiprocess模块 multiprocess不是一个模块而是python中一个操作.管理进程的包. 子模块分为四个部分: 创建进程部分 进程同步部分 进程池部分 进程之间数据共享 二.m ...

  6. Oracle执行过程中出现的问题

    ORA-02292: 违反完整约束条件 (用户名.约束名) - 已找到子记录 造成原因:删除该表时,有依赖该表的子表数据,需要删除该条记录或者禁用约束. 查看约束所在的表:select * from ...

  7. Lexicographical Substring Search SPOJ - SUBLEX (后缀自动机)

    Lexicographical Substrings Search \[ Time Limit: 149 ms \quad Memory Limit: 1572864 kB \] 题意 给出一个字符串 ...

  8. LeetCode 325. Maximum Size Subarray Sum Equals k

    原题链接在这里:https://leetcode.com/problems/maximum-size-subarray-sum-equals-k/ 题目: Given an array nums an ...

  9. 浅谈LCA

    目录 什么是LCA 倍增求LCA dfs bfs 树剖求LCA 什么是LCA LCA就是最近公共祖先 对于有根树\(Tree\)的两个结点\(u.v\),最近公共祖先\(LCA(T,u,v)\)表示一 ...

  10. 你向 Mysql 数据库插入 100w 条数据用了多久?

    阅读本文大概需要 2 分钟. ▌目录 多线程插入(单表) 多线程插入(多表) 预处理 SQL 多值插入 SQL 事务( N 条提交一次) ▌多线程插入(单表) 问:为何对同一个表的插入多线程会比单线程 ...