NJU1healer的个人博客分享 http://blog.sciencenet.cn/u/NJU1healer

博文

python 中在字符串前面加上b,u,r的含义

已有 8005 次阅读 2020-8-20 18:29 |个人分类:Python|系统分类:科研笔记

在python编写中,大家经常见到一下的几种情况:

b'Hello,world!'

r'\s\d{3,6}'

在或

u'生日快乐'

第一种情况b
python3.x里默认的str是(py2.x里的)unicode, bytes是(py2.x)的str, b”“前缀代表的就是bytes ;
python2.x里, b前缀没什么具体意义, 只是为了兼容python3.x的这种写法。

第二种情况r
常用于正则表达式或文件绝对地址等,该字母后面一般一般接转义字符,有特殊含义的字符。所以,要使用转义字符,通常字符串前面要加r。

第三种情况u
u后面的字符串表示使用Unicode编码,因为中文也有对应的Unicode编码,所以常用于中文字符串的前面,防止出现乱码。


python3字符串编码总结-str(unicode)_bytes

概述:python3中默认对字符串采用的是unicode编码的str类型来表示,任一字符用两字节表示。而bytes类型,其本质是比特流,即"10110011 00110011 xxxxxxxx",bytes表示的比特流是什么含义由不同的编码格式确定,比如如果是ascii编码,那么每8位表示一个字符。python3在进行文件操作和网络通信都是使用bytes进行的,所以对于str类型要进行编码后才能写入文件或网络。

1. 字符串的编码形式

       字符串的编码最一开始是ascii,使用8位二进制表示,因为英文就是编码的全部。后来其他国家的语言加入进来,ascii就不够用了,所以一种万国码就出现了,它的名字就叫unicode,unicode编码对所有语言使用两个字节,部分汉语使用三个字节。但是这就导致一个问题,就是unicode不仅不兼容ascii编码,而且会造成空间的浪费,于是uft-8编码应运而生了,utf-8编码对英文使用一个字节的编码,由于这样的特点,很快得到全面的使用。

2. 字节码bytes

       python3中bytes用b’xxx’表示,其中的x可以用字符,也可以用ascii表示。python3中的二进制文件(如文本文件)统一采用字节码读写。

2.1. 字节码的使用举例

这里写图片描述

2.2. 字节码的修改

要修改bytes中的某一个字节必须要将其转换为bytearray以后才可以。如下:

这里写图片描述

2.3. 字节码bytes与字符之间的关系

       将表示二进制的bytes进行适当编码就可以变为字符了,比如utf-8或是gbk等等编码格式都可以。(所以我个人的理解就是:有utf-8格式的bytes,也有gbk格式的bytes等等)。

3.字节码bytes与unicode编码的相互转换

3.1 python2与python3字符串编码的区别

python3默认使用的是str类型对字符串编码,默认使用bytes操作二进制数据流,两者不能混淆!!
Python3有两种表示字符序列的类型:bytes和str。前者的实例包含原始的8位值,后者的实例包含Unicode字符。Python2也有两种表示字符序列的类型,分别叫做str和Unicode,与Python3不同的是,str实例包含原始的8位值;而unicode的实例,则包含Unicode字符。

3.2 bytes与str类型的相互转换

str(unicode)类型是基准!要将str类型转化为bytes类型,使用encode()内置函数;反过来,使用decode()函数。使用实例如下:

>>>oath = ‘我爱妞’
>>>type(oath)
<class 'str'>
>>>oath = oath.encode(‘utf-8’)
>>> type(oath)
<class 'bytes'>
>>> oath
b'\xe6\x88\x91\xe7\x88\xb1\xe5\xa6\x9e'
>>> oath = oath.decode()
>>> oath
'我爱妞'

为了方便开发者的使用,可以编写两个helper函数,第一个是无论输入的是str还是bytes类型都输出str

def to_str(bytes_or_str):
  if isinstance(bytes_or_str, bytes):
    value = bytes_or_str.decode('utf-8')
  else:
    value = bytes_or_str
  return value # Instance of str123456

另外,还需要编写接受str或bytes,并总是返回bytes的方法

def to_bytes(bytes_or_str):
  if isinstance(bytes_or_str, str):
    value = bytes_or_str.encode('utf-8)
  else:
    value = bytes_or_str
  return value # Instance of bytes

3.3 文件的编码

with open(‘sun.bin’,’wb’) as f:
	f.write(b‘sui’)

        在open文件的时候用“wb”方式打开,即二进制写的方式,所以下面的write函数对象用的是bytes类型的b’sui’,这个时候如果使用f.write(‘sui’)就会出错的。
(注:对打开文件的路径的操作,使用os模块的getcwd方法以及chdir方法)

3.4 网页的编码

>>>import urllib.request
>>>response = urllib.request.urlopen(‘http://www.baidu.com’)
>>>html = response.read()
>>>type(html)
<class 'bytes'>

所以要正常显示的话,就要使用decode()方法了。


【参考】

https://www.cnblogs.com/yanglang/p/7416889.html

https://blog.csdn.net/Setul/article/details/52203894



https://blog.sciencenet.cn/blog-3428464-1247188.html

上一篇:[转载]Python中的with用法
下一篇:Python中reshape函数(-1表示什么)与数据白化
收藏 IP: 211.162.81.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

全部作者的其他最新博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-11-26 12:45

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部