- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Effective Python bytes 与 str 的区别由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
bytes
:实例包含的是 原始数据 ,即 8 位的无符号值(通常按照 ASCII 编码 标准来显示)str
:实例包含的是 Unicode
码点(code point,也叫作代码点),这些码点与人类语言之中的文本字符相对应
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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
数据转换成二进制数据,必须调用 str 的 encode
方法(编码)Unicode
数据,必须调用 bytes 的 decode
方法(解码)
使用原始的 8 位值与 Unicode 字符串时需要注意的两个问题:
bytes
和 str
时需要注意的两个问题
使用 + 操作符:
1
2
3
4
5
6
7
8
9
10
|
# bytes+bytes
print
(b
'a'
+
b
'1'
)
# str+str
print
(
'b'
+
'2'
)
# 输出结果
b
'a1'
b2
|
bytes + bytes
,str + str
都是允许的bytes + str
会报错# 。
1
2
3
4
5
6
7
|
bytes
+
str
print
(
'c'
+
b
'2'
)
# 输出结果
print
(
'c'
+
b
'2'
)
TypeError: can only concatenate
str
(
not
"bytes"
) to
str
|
同类型之间也可以用二元操作符来比较大小 。
1
2
3
|
assert
b
'c'
> b
'a'
assert
'c'
>
'a'
|
但 bytes 和 str 之间用二元操作符也会报错 。
1
2
3
4
5
6
|
assert
b
'c'
>
'a'
# 输出结果
assert
b
'c'
>
'a'
TypeError:
'>'
not
supported between instances of
'bytes'
and
'str'
|
判断 bytes 与 str 实例是否相等 两个类型的实例相比较总会为 False,即使字符完全相同 。
1
2
3
4
5
6
|
# 判断 str、bytes
print
(
'a'
=
=
b
'a'
)
# 输出结果
False
|
格式化字符串中的 %s 。
两种类型的实例都可以出现在 % 操作符的右侧,用来替换左侧那个格式字符串(format string)里面的 %s 。
但是!如果格式字符串是 bytes 类型,那么 不能 用 str 实例来替换其中的 %s ,因为 Python 不知道这个 str 应该按照什么字符集来编码 。
1
2
3
4
5
6
7
|
# %
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,但结果可能不是预期结果 。
1
2
3
4
5
6
|
# %
print
(
'red %s'
%
b
'blue'
)
# 输出结果
red b
'blue'
|
这样会让系统在 bytes 实例上面调用 __repr__ 方法 调用结果替换格式字符串里的 %s,因此程序会直接输出 b'blue',而不是输出 blue 。
不能使用原始的 bytes 。
向文件写入二进制数据会报错:
1
2
3
4
5
6
7
8
|
# 写入二进制数据
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
即可正常写入二进制数据
1
2
3
4
5
6
7
8
9
10
11
|
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
|
bytes.decode
把这份数据解码成 str 字符串,再用 str.encode
把字符串编码成二进制值UTF-8
,所以系统很可能会把 b'\xf1\xf2\xf3\xf4\xf5'
当成 UTF-8 格式的字符串去解码,于是就会出现上面那样的错误将模式改成 rb 即可正常读取二进制数据:
1
2
3
4
5
6
|
with
open
(
'test.txt'
,
"rb"
) as f:
print
(b
"\xf1\xf2"
=
=
f.read())
# 输出结果
True
|
另一种改法,设置 encoding 参数指定字符串编码:
1
2
3
4
5
6
|
with
open
(
'test.txt'
,
"r"
, encoding
=
"cp1252"
) as f:
print
(f.read())
# 输出结果
ñò
|
这样也不会有异常了 。
需要注意:当前操作系统默认的字符集编码,Python 一行代码查看当前操作系统默认的编码标准 。
在 cmd 中执行
12> python3 -c 'import locale; print(locale.getpreferredencoding())'
UTF-8
到此这篇关于Effective Python bytes 与 str 的区别的文章就介绍到这了,更多相关Python bytes 与 str 的区别内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://www.cnblogs.com/poloyy/p/15549664.html 。
最后此篇关于Effective Python bytes 与 str 的区别的文章就讲到这里了,如果你想了解更多关于Effective Python bytes 与 str 的区别的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
你信吗?我有一个这样的循环(请原谅任何错误,我不得不大量编辑大量信息和变量名称,相信我它有效)。 ...旧示例已删除,请参见下面的代码... 如果我将那些中间的 str = "Blah\(odat.c
我正在做一个本地测试来比较 C# 中 String 和 StringBuilder 的 Replace 操作性能,但是对于 String 我使用了以下代码: String str = "String
我想知道为什么str += "A"和 str = str + "A"有不同的表现。 在实践中, string str = "cool" for(int i = 0; i approximately
我有一个类型列表 [("['106.52.116.101']", 1), ("['45.136.108.85']", 1)] 并想将其转换为 [('106.52.116.101', 1), ('45.
我有一个类型列表 [("['106.52.116.101']", 1), ("['45.136.108.85']", 1)] 并想将其转换为 [('106.52.116.101', 1), ('45.
我正在遍历 HashMap并通过一些本地变量中的模式匹配将值放入其中。 委托(delegate)者 fn lyrics_no_bottles(song_template:&mut String){
如果字符串(短语)中只有元音,它(对我而言)说True;否则说 False。我不明白为什么它总是返回 False,因为 (x >= x) 总是返回 True。我感谢任何人检查此查询的解决方案。 (st
我有代码以某种方式转换字符串引用,例如取第一个字母 trait Tr { fn trim_indent(self) -> Self; } impl Tr for &'a str { f
我正在学习指针,这是我的代码。我定义了一个指向 char(实际上是字符串)的指针 *str 和一个指向 int *a 的指针,它们的定义方式相同。我认为 str 和 a 都应该是一个地址,但是当我试图
为什么我会收到错误消息?我已经正确添加了类型,对吗? Invalid index type "str" for "Union[str, Dict[str, str]]"; expected type
你知道下面两个函数是否等价吗? function validate(str) { return ( ['null','','undefined'].indexOf(str) [v, valida
我正在解决这里的 Dataquest 问题:https://app.dataquest.io/m/293/data-cleaning-basics/5/removing-non-digit-chara
我有一个字符串列表,如下所示: ["A TB", "A-R TB", "B TB", "B-R TB", "C TB", "C-R TB"...] 但字符串的顺序是随机的。我如何编写一个将元素配对的函
我正在尝试将此函数从使用 split 改为使用 str.extract (正则表达式)。 def bull_lev(x): spl = x.rsplit(None, 2)[-2].strip(
给定这样的数据结构: [{'a':1, 'b': 2}, {'c':3 }, {'a':4, 'c':9}, {'d':0}, {'d': 0, 'b':6}] 目标是解析数据以产生: {'a': 2
给定这样的数据结构: [{'a':1, 'b': 2}, {'c':3 }, {'a':4, 'c':9}, {'d':0}, {'d': 0, 'b':6}] 目标是解析数据以产生: {'a': 2
s = 'someString' s = QTreeWidgetItem(s) print(s.text(0)) # 0 being 'column' 输出: 's' 如果我对另一
黑白有什么区别: function(char* str ) function(char* str[] ) function(char str[] ) 它们是如何被调用的(通过什么类型的string/c
我试过谷歌搜索但找不到准确的答案,所以请允许我尝试在这里提问。如果问题看起来不合适,请告诉我,我会删除它。 在 JS 中,您可以通过三种不同的方式编写特定的内置功能: 字符串长度 str.toStri
我有这段代码(我的 strlen 函数) size_t slen(const char *str) { size_t len = 0; while (*str) {
我是一名优秀的程序员,十分优秀!