zoukankan      html  css  js  c++  java
  • python3 bytes数据类型探讨

    python3中str和bytes分开了,那么bytes与str之间到底是什么关系呢?下面从表现形式、处理方式、存储形式三个方面来阐述其区别

    1. 在字符串前面加上b,就表示bytes数据类型

    1 s1 = "hello"
    2 b1 = b"hello"   # 前面加上b让它变成bytes类型
    3 print(s1)
    4 print(b1)

    输出

    s1 = "hello"
    b1 = b"hello"   # 前面加上b让它变成bytes类型
    print(s1)
    print(b1)

    2. 字符串是以字符为单位进行处理的,bytes类型是以字节为单位处理的。

    python3中bytes类型主要用于网络传输和硬盘存储,是以字节为单位处理的

    3. 字符串的编码方法只能是Unicode,bytes可以是gbk,utf-8或其他非Unicode形式。bytes类型只负责以二进制字节序列的形式记录信息,至于该二进制序列表示什么信息(比如到底是什么字符)由编码形式决定

    python3中对str和bytes做了严格区分,文本总是用str类型表示,编码方式是Unicode,二进制数据则用bytes类型表示。下麦呢来看一段代码

    1 s = "hello中国"
    2 b = s.encode("utf-8")
    3 print(b)
    4 for i in b:      # bytes类型也是可迭代对象,是不是很神奇
    5     print(i)
    6 for i in b:
    7     print(bin(i))

    输出

    b'helloxe4xb8xadxe5x9bxbd'
    104
    101
    108
    108
    111
    228
    184
    173
    229
    155
    189
    0b1101000
    0b1100101
    0b1101100
    0b1101100
    0b1101111
    0b11100100
    0b10111000
    0b10101101
    0b11100101
    0b10011011
    0b10111101
    
    Process finished with exit code 0

    bytes实际上是一串0和1的组合,但为了在ide环境中让我们相对直观的观察,它被表现成了b'xe4xb8xadxe6x96x87'这种形式,开头的b表示这是一个bytes类型。xe4是十六进制的表示方式,它占用1个字节的长度。bytes是一种比特流,它的存在形式是01010001110这种。我们无论是在写代码,还是阅读文章的过程中,肯定不会有人直接阅读这种比特流,它必须有一个编码方式,使得它变成有意义的比特流,而不是一堆晦涩难懂的01组合。

    字符串有一个encode()方法,与bytes的decode方法相对应,利用这两个方法可以实现字符串与bytes类型的转化

    1 s1 = "hello"
    2 b1 = s1.encode("utf-8")
    3 print(b1)
    4 s2 = b1.decode("utf-8")
    5 print(s2)

    输出

    b'hello'
    hello
    
    Process finished with exit code 0

    还有一种方法,就是利用调用bytes()类和str()类来完成转化

    1 b1 = bytes(s1, encoding="utf-8")
    2 print(b1)
    3 s2 = str(b1, encoding="utf-8")
    4 print(s2)

    输出‘

    b'hello'
    hello
    
    Process finished with exit code 0

    实际上,我们知道,所有数据包括字符串,存储到硬盘上都是以0101的形式,也都需要编码解码。关于bytes和str,只需记住这几句话:

    (1)在将字符串存入磁盘和从磁盘读取字符串的过程中,Python自动地帮你完成了编码和解码的工作,你不需要关心它的过程;

    (2)使用bytes类型,实质上是告诉Python,不需要它帮你自动地完成编码和解码的工作,而是用户自己手动进行,并指定编码格式;

    (3)bytes类型主要用于网络传输和硬盘存储

  • 相关阅读:
    Oracle和SQLServer中实现跨库查询
    sqlserver中创建链接服务器
    无法从命令行或调试器启动服务,必须首先安装Windows服务(使用installutil.exe),然后用ServerExplorer、Windows服务器管理工具或NET START命令启动它
    Win8系统运行程序提示“占位程序接收到错误数据”的解决方法
    设计模式——简单工厂模式
    设计模式——单例模式
    设计模式——观察者模式
    三一集团提前批java面经
    form表单传到后端的数据乱码
    Failed to obtain the JDBC Connection + Access denied for user 'XXX'@'localhost' (using password: YES)
  • 原文地址:https://www.cnblogs.com/zzliu/p/10181938.html
Copyright © 2011-2022 走看看