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