python的string和bytes

最近用到python3的文件存储,

想直接将文件上传之后存储到mongodb中,

用到了bson.binary这个库,从网上搜集了一些资料

将bytes直接输出到浏览器上虽然能显示文本,但是也会保留\r\n的部分,所以需要重新转成string,经过测试不会出现上述问题。

 

 

python 3中最重要的新特性可能就是将文本(text)和二进制数据做了更清晰的区分。文本总是用unicode进行编码,以str类型表示;而二进制数据以bytes类型表示。

在python3中,不能以任何隐式方式将str和bytes类型二者混合使用。不可以将str和bytes类型进行拼接,不能在str中搜索bytes数据(反之亦然),也不能将str作为参数传入需要bytes类型参数的函数(反之亦然)。

 

字符串和字节符之间划分界线是必然的。下面这个图解要牢记于心:

strings可以被编码(encode)成字bytes,bytes也可以解码(decode)成strings:

1

2

3

4

>>> '€20'.encode('utf-8')

b'\xe2\x82\xac20'

>>> b'\xe2\x82\xac20'.decode('utf-8')

'€20'

可以这样理解:

string是文本(text)的抽象表示。字符串(string)由字符组成,字符也是抽象的实体且与任何二进制表示无关。
当操纵字符串的时候,很多细节是不用了解的。我们可以分割、切片和拼接字符串,在字符串内部进行搜索。但并不在乎内部是如何表示的,也不用在意底层一个字符要花费多少byte。
只有在需要将string编码(encode)成byte的时候,比如:通过网络传输数据;或者需要将byte解码(decode)成string的时候,我们才会关注string和byte的区别。

 

传入encode和decode的参数是编码方式。编码是一种用二进制数据表示抽象字符的方式。目前有很多种编码。上面给出的UTF-8是其中一种,下面是另一种:

1

2

3

4

>>> '€20'.encode('iso-8859-15')

b'\xa420'

>>> b'\xa420'.decode('iso-8859-15')

'€20'

编码是这个转换过程中至关重要的一部分。若不编码,bytes对象b'\xa420'只是一堆比特位而已。编码赋予其含义。采用不同的编码,这堆比特位的含义就会大不同:

1

2

>>> b'\xa420'.decode('windows-1255')

'₪20'

 

1、bytes主要是给在计算机看的,string主要是给人看的

2、中间有个桥梁就是编码规则,现在大趋势是utf8

3、bytes对象是二进制,很容易转换成16进制,例如\x64

4、string就是我们看到的内容,例如'abc'

5、string经过编码encode,转化成二进制对象,给计算机识别

6、bytes经过反编码decode,转化成string,让我们看,但是注意反编码的编码规则是有范围,\xc8就不是utf8识别的范围

7、实例:

#!/usr/bin/env python
# -*- coding: utf8 -*-
# __Author: "Skiler Hao"
# date: 2017/4/9 15:26
import hashlib

#字节对象b
b = b"example"
#字符串对象s
s = "example"
print(b)
print("example")

#将字符串转换为字节对象
b2 = bytes(s,encoding='utf8')  #必须制定编码格式
# print(b2)
#字符串encode将获得一个bytes对象
b3 = str.encode(s)
b4 = s.encode()
print(b3)
print(type(b3))
print(b4)
#将字节对象decode将获得一个str对象
s2 = bytes.decode(b)
s3 = b.decode()
print(s2)
print(s3)

感慨一下,python的字符串处理真的方便,类型也非常的清晰,以前学mfc的时候光字符串类型就够喝一壶的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值