【Python数据类型】表示字符序列

news/2024/11/25 21:21:02/

Python 有两种类型可以表示字符序列

  • bytes:实例包含的是原始数据,即 8 位的无符号值(通常按照 ASCII 编码标准来显示)
  • str:实例包含的是 Unicode 码点(code point,也叫作代码点),这些码点与人类语言之中的文本字符相对应
a = b'h\x6511o'
print(list(a))
print(a)a = 'a\\u300 propos'
print(list(a))
print(a)# 输出结果
[104, 101, 49, 49, 111]
b'he11o'['a', '\\', 'u', '3', '0', '0', ' ', 'p', 'r', 'o', 'p', 'o', 's']
a\u300 propos

Unicode 数据和二进制数据转换

  • 把  Unicode 数据转换成二进制数据,必须调用 str 的 encode 方法(编码)
  • 把二进制数据转换成 Unicode 数据,必须调用 bytes 的 decode 方法(解码)
  • 调用这些方法时,可以明确指出字符集编码,也可以采用系统默认的方案,通常是 UTF-8

使用原始的 8 位值与 Unicode 字符串时需要注意的两个问题

该问题等价于:使用 bytes 和 str 时需要注意的两个问题

问题一:bytes 和 str 的实例互不兼容

使用 + 操作符

ex:

  • bytes + bytes,str + str 都是允许的
  • 但 bytes + str 会报错
# bytes+str
print('c' + b'2')# 输出结果
print('c' + b'2')
TypeError: can only concatenate str (not "bytes") to str

同类型之间也可以用二元操作符来比较大小

assert b'c' > b'a'assert 'c' > 'a'

但 bytes 和 str 之间用二元操作符也会报错

assert b'c' > 'a'# 输出结果assert b'c' > 'a'
TypeError: '>' not supported between instances of 'bytes' and 'str'

判断 bytes 与 str 实例是否相等

两个类型的实例相比较总会为 False,即使字符完全相同

# 判断 str、bytes
print('a' == b'a')# 输出结果
False

格式化字符串中的 %s

两种类型的实例都可以出现在 % 操作符的右侧,用来替换左侧那个格式字符串(format string)里面的 %s

但是!如果格式字符串是 bytes 类型,那么不能用 str 实例来替换其中的 %s,因为 Python 不知道这个 str 应该按照什么字符集来编码

# %
print(b'red %s' % 'blue')# 输出结果print(b'red %s' % 'blue')
TypeError: %b requires a bytes-like object, or an object that implements __bytes__, not 'str'

但是!反过来却可以,如果格式字符串是 str 类型,则可以用bytes 实例来替换其中的 %s,但结果可能不是预期结果

# % 
print('red %s' % b'blue')# 输出结果
red b'blue'
  • 这样会让系统在 bytes 实例上面调用 __repr__ 方法
  • 调用结果替换格式字符串里的 %s,因此程序会直接输出 b'blue',而不是输出 blue

问题二:操作文件句柄时需要使用 Unicode 字符串操作

不能使用原始的 bytes

向文件写入二进制数据会报错

# 写入二进制数据
with open('test.txt', "w+") as f:f.write(b"\xf1\xf2")# 输出结果f.write(b"\xf1\xf2")
TypeError: write() argument must be str, not bytes
  • 报错是因为 w 模式必须以文本模式写入
  • 将模式改成 wb 即可正常写入二进制数据

with open('test.txt', "wb") as f:f.write(b"\xf1\xf2")

读取文件中二进制数据

with open('test.txt', "r+") as f:f.read()# 输出结果(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 0: invalid continuation byte
  •  报错是因为 r 模式必须以文本模式读取
  • 以文本模式操纵文件句柄时,系统会采用默认的文本编码方案处理二进制数据
  • 所以,上面那种写法会让系统通过 bytes.decode 把这份数据解码成 str 字符串,再用 str.encode 把字符串编码成二进制值
  • 然而对于大多数系统来说,默认的文本编码方案是UTF-8,所以系统很可能会把 b'\xf1\xf2\xf3\xf4\xf5' 当成  UTF-8 格式的字符串去解码,于是就会出现上面那样的错误

将模式改成 rb 即可正常读取二进制数据

with open('test.txt', "rb") as f:print(b"\xf1\xf2" == f.read())# 输出结果
True

另一种改法,设置 encoding 参数指定字符串编码

with open('test.txt', "r", encoding="cp1252") as f:print(f.read())# 输出结果
ñò

这样也不会有异常了


http://www.ppmy.cn/news/292721.html

相关文章

Python | bytes 与 str 的区别

本文主要介绍在 Python 中 bytes 与 str 的区别。1 Updated: 2022 / 6 / 16 bytes 与 str 的区别 参考链接 1. Python 有两种类型可以表示字符序列 bytes 下面所示实例包含的是原始数据 ,即 8 位的无符号值(通常按照 ASCII编码 标准来显示)s…

USB2.0 UTMI接口

1. UTM Functional Block Diagram 2. UTMI Signal Descriptions 2.1 System Interface Signals 2.2 Data Interface Signals 2.3 Vendor Control Signals These signals are provided for vendor-defined error,

python气象数据处理与绘图_Python气象数据处理与绘图(15):两种波作用通量计算的python实现及对比(Plumb T-N) (已更正)...

大气动力学中通常用波作用通量来诊断 Rossby波的传播。常用的三种波作用通量分别为局地E-P 通量,Plumb 波作用通量和T-N 波作用通量。局地E-P 通量可以诊断一段时间内天气尺度瞬变波对定长波的调控作用,但无法直接表现Rossby长波的时间演变过程,然而T-N 波或Plumb 波作用通量…

嵌入式Linux驱动开发IDE - Visual Studio Code配置使用(强烈推荐!!!)

目录 一 安装visual studio code(简称vscode) 二 vscode新建工作空间 三 添加头文件搜索路径 四 添加宏定义 五 按F12或者"Ctrl单击"可快速定位到定义与自动补全功能 六 设置左侧目录不自动展开 七 设置隐藏文件夹 八 编译生成可执行文件 一 …

Windows 10磁盘碎片整理:含义和操作方法

什么是Windows磁盘碎片? 随着电脑硬盘使用时间的增长,磁盘上会产生大量的垃圾碎片。这些碎片会分布在磁盘的各个角落,严重影响磁盘的响应速度。为了在一定程度上提高系统性能,定期使用Windows10的磁盘碎片整理工具来进行碎片整…

Effective Python(3)- 了解 bytes 与 str 的区别

Python 有两种类型可以表示字符序列 bytes:实例包含的是原始数据,即 8 位的无符号值(通常按照 ASCII 编码标准来显示)str:实例包含的是 Unicode 码点(code point,也叫作代码点),这些码点与人类语言之中的文本字符相对应…

重视用户体验,最舒服的随身wifi还是“它”

在人们对网络依赖度越来越高的今天,可以随时随地上网且费用便宜的网络,才是人们想要的。如果不想长时间启动手机热点,影响手机使用寿命,那么小巧便携的随身WiFi就是人们的不错选择。 作为技术成熟的4G随身WiFi产品,每…

五一节假日将至 随行WiFi保出行体验

有多个政府在今年的工作报告中提出,要优先扩大恢复消费市场,大力推动体育、文化、旅游、餐饮等生活服务消费恢复。在结束了三年疫情后,今年将是推动旅游出行市场恢复至关重要的一年。 五一节假日即将到来,全国有很多的媒体报道小队…