• 各种转码(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!
    Hi!
    Goodbye!')
    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'xe4xb8xadxe6x96x87'
    # 写入的不是str,而是经过UTF-8编码的bytes。
    
    # 和StringIO类似,可以用一个bytes初始化BytesIO,然后,像读文件一样读取:
    from io import BytesIO
    f = BytesIO(b'xe4xb8xadxe6x96x87')
    f.read() # b'xe4xb8xadxe6x96x87'

    注意指针问题

      .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)

                               

  • 相关阅读:
    网络流
    随机化
    sw抄来的主席树
    牛客SQL题解-统计各个部门的工资记录数
    牛客SQL题解-查找所有员工自入职以来的薪水涨幅情况
    牛客SQL题解-查找薪水排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不能使用order by完成
    牛客SQL题解-查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工
    牛客SQL题解-获取薪水第二多的员工的emp_no以及其对应的薪水salary
    牛客SQL题解-统计出各个title类型对应的员工薪水对应的平均工资avg
    牛客SQL题解-查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列
  • 原文地址:https://www.cnblogs.com/zhuminghui/p/11359858.html
Copyright © 2020-2023  润新知