在 Python 3 中,当我使用模式字符串 'rb' 打开一个文本文件,然后执行 f.read() 时,我惊讶地发现在字符 'b' 后面用单引号括起来的文件内容。
在 Python 2 中,我只获取文件内容。
我确信这是众所周知的,但我在 doco 中找不到任何关于它的信息。有人可以指点我吗?
在 Python 3 中,当我使用模式字符串 'rb' 打开一个文本文件,然后执行 f.read() 时,我惊讶地发现在字符 'b' 后面用单引号括起来的文件内容。
在 Python 2 中,我只获取文件内容。
我确信这是众所周知的,但我在 doco 中找不到任何关于它的信息。有人可以指点我吗?
在 Python 3 中也可以得到“只是文件内容”。很可能你可以继续做你正在做的任何事情。继续阅读以获得更长的解释:
b'' 表示结果值是一个bytes
字符串。-string 与普通字符串bytes
非常相似,但不完全一样,用于处理二进制、非文本数据。
对二进制数据没有意义的字符串上的一些方法已经消失,但大多数仍然存在。一个很大的区别是,当你从一个bytes
字符串中获取一个特定的字节时,你会得到一个整数,而对于一个普通的str
你会得到一个 one-length str
。
>>> b'foo'[1]
111
>>> 'foo'[1]
'o'
如果您以带有 't' 标志的文本模式打开文件,您会得到str
回复。Python 3str
在 Python 2 中被称为unicode
. 它用于处理文本数据。
您可以在bytes
and方法之间来回转换。str
.encode()
.decode
首先,Python 2 的str
类型在 Python 3 中被重命名为bytes
,字节文字使用b''
前缀。Python 2unicode
类型是新的 Python 3str
类型。
要在 Python 2 中获取 Python 3 文件行为,您可以使用io.open()
or codecs.open()
; Python 3默认将文本文件解码为 Unicode 。
你看到的是,对于二进制文件,Python 3 提供了与 Python 2完全相同的东西,即字节字符串。然后发生的变化是repr()
字节字符串的前缀为,b
并且该print()
函数将使用repr()
传递给它的任何对象的表示形式,除了 unicode 值。
要使用函数将二进制数据打印为 unicode 文本,print()
请先将其解码为 unicode。但是,无论如何,您也许可以将文件作为文本文件打开。
该bytes
类型还有一些其他改进,以反映您正在处理二进制数据,而不是文本。例如,索引单个字节或迭代一个bytes
值会为您提供int
值(0 到 255 之间)而不是字符。
有时我们需要(需要?)知道文本文件是否有单字符换行符(0A)或双字符换行符(0D0A)。
我们过去常常通过以二进制模式打开文本文件、识别 0D 和 0A 并将其他字节视为常规文本字符来避免混淆。
可以通过查找所有二进制模式读取并用剥离添加材料的新函数 oldread() 替换它们来移植此类代码,但这有点痛苦。
我想 Python 神学家想保持 'rb' 原样,并为新行为添加一个新的 'rx' 或其他东西。只是为了废除一些东西,似乎有点霸道。
但是,就是这样,通过在 Lennert 的文档中搜索“rb”肯定可以回答这个问题。