1

在 Python 3 中,当我使用模式字符串 'rb' 打开一个文本文件,然后执行 f.read() 时,我惊讶地发现在字符 'b' 后面用单引号括起来的文件内容。

在 Python 2 中,我只获取文件内容。

我确信这是众所周知的,但我在 doco 中找不到任何关于它的信息。有人可以指点我吗?

4

3 回答 3

2

在 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. 它用于处理文本数据。

您可以在bytesand方法之间来回转换。str.encode().decode

于 2013-07-05T10:00:33.387 回答
2

首先,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()请先将其解码为 un​​icode。但是,无论如何,您也许可以将文件作为文本文件打开。

bytes类型还有一些其他改进,以反映您正在处理二进制数据,而不是文本。例如,索引单个字节或迭代一个bytes值会为您提供int值(0 到 255 之间)而不是字符。

于 2013-07-05T10:00:49.290 回答
0

有时我们需要(需要?)知道文本文件是否有单字符换行符(0A)或双字符换行符(0D0A)。

我们过去常常通过以二进制模式打开文本文件、识别 0D 和 0A 并将其他字节视为常规文本字符来避免混淆。

可以通过查找所有二进制模式读取并用剥离添加材料的新函数 oldread() 替换它们来移植此类代码,但这有点痛苦。

我想 Python 神学家想保持 'rb' 原样,并为新行为添加一个新的 'rx' 或其他东西。只是为了废除一些东西,似乎有点霸道。

但是,就是这样,通过在 Lennert 的文档中搜索“rb”肯定可以回答这个问题。

于 2013-07-05T17:37:16.280 回答