我正在寻找一个格式化的字节字符串文字
name = "Hello" bytes(f"Some format string {name}")
可能是 fb"Some format string {name}"之类的。
fb"Some format string {name}"
有这种东西吗?
这是 python2到 python3之间较大的变化之一,它们处理 unicode 和字符串的方式不同。
这就是转换字节的方法。
string = "some string format" string.encode() print(string)
这就是解码字符串的方法。
string.decode()
通过 Charles Severence 的这个 Coursera 讲座,我更好地理解了 Python2与3更改为 unicode 之间的区别。您可以观看整个17分钟的视频,或者快进到10:30左右,如果您想了解 Python 2和3之间的区别,以及它们如何处理字符,特别是 unicode。
我理解您的实际问题是如何格式化同时包含字符串和字节的字符串。
inBytes = b"testing" inString = 'Hello' type(inString) #This will yield <class 'str'> type(inBytes) #this will yield <class 'bytes'>
这里您可以看到我有一个字符串,一个变量和一个字节变量。
这就是将字节和字符串组合成一个字符串的方法。
formattedString=(inString + ' ' + inBytes.encode())
没有:
出于同样的原因,我们不支持 bytes.format(),你可以 不要将 'f'与 'b'字符串字面值组合在一起 对象的 __format__()方法可以返回 Unicode 数据 与字节字符串不兼容的。 二进制 f 字符串首先需要解决 这个想法在过去已经被提出,大多数 最近在 PEP 461。这样一个功能的讨论通常 都不是 添加诸如 __bformat__()之类的方法,以便对象可以控制如何将其转换为字节,或者 具有 bytes.format()不像 str.format()那样具有通用性或可扩展性。 如果这样的功能存在的话,这两者在将来都将作为选项 是我们渴望的。
出于同样的原因,我们不支持 bytes.format(),你可以 不要将 'f'与 'b'字符串字面值组合在一起 对象的 __format__()方法可以返回 Unicode 数据 与字节字符串不兼容的。
bytes.format()
'f'
'b'
__format__()
二进制 f 字符串首先需要解决 这个想法在过去已经被提出,大多数 最近在 PEP 461。这样一个功能的讨论通常 都不是
添加诸如 __bformat__()之类的方法,以便对象可以控制如何将其转换为字节,或者
__bformat__()
具有 bytes.format()不像 str.format()那样具有通用性或可扩展性。
str.format()
如果这样的功能存在的话,这两者在将来都将作为选项 是我们渴望的。
在 python 3.6.2中,字节的百分比格式化适用于某些用例:
print(b"Some stuff %a. Some other stuff" % my_byte_or_unicode_string)
但作为 AXO 评论:
这不一样。%a(或 %r)将给出字符串的表示,而不是字符串本身。例如,b'%a' % b'bytes'将给出 b"b'bytes'",而不是 b'bytes'。
%a
%r
b'%a' % b'bytes'
b"b'bytes'"
b'bytes'
根据您是否需要在 UI 中仅显示带格式的 byte _ or _ unicode _ string,或者是否可能需要进一步操作,这两者可能有关系,也可能无关紧要。
在3.6 + 中,你可以做到:
>>> a = 123 >>> f'{a}'.encode() b'123'
实际上,您的建议非常接近; 如果您在 bytes()调用中添加一个 encoding kwarg,那么您将得到所需的行为:
bytes()
encoding
>>> name = "Hello" >>> bytes(f"Some format string {name}", encoding="utf-8") b'Some format string Hello'
注意: 对我来说,这在3.8版本中是可行的,但是请注意,在文档的 字节对象标题的底部,似乎建议这应该适用于所有3.x 版本中的任何字符串格式化方法(对于版本 < 3.6的版本,使用 str.format(),因为那时添加了 f 字符串,但是 OP 特别要求大约3.6 +)。