为什么read()输出一个字节而不是字符串?

Dzh*_*hao 3 python file-io python-3.x

我试图分析一些二进制文件,并假设Python的read()函数返回了本文和Tutorials Point 文章中的字符串.

然而,当我弄乱read()自己时,我得到的东西不是我读到的东西.

>>> with gzip.open('RTLog_20150424T194428.gz') as f:
       a = f.read(3)
       print(a)
       type(a)


b'use'
<class 'bytes'>
>>> a
b'use'
>>> str(a)
"b'use'"
>>> b = 'asdfasdfasdf'
>>> type(b)
<class 'str'>
>>> 
Run Code Online (Sandbox Code Playgroud)

当我自己测试时,read()调用的输出返回一个<class 'bytes'>对象,而不是一个<class 'str'>对象.

我得不到什么?

wim*_*wim 6

您可以打开rbrt模式(默认为读取二进制,为您提供字节).这在gzip.opendocstring中提到:

对于二进制模式,mode参数可以是"r","rb","w","wb","x","xb","a"或"ab",或"rt","wt","用于文本模式的xt"或"at".默认模式为"rb",默认的compresslevel为9.

如果mode="rt"在打开时传递关键字参数(并且您知道正确的编码),那么在调用read方法时应该返回一个字符串.

  • @Dzhao:是的,应该如此.您可能会对假定Python 2的资源感到困惑,其中`str`是字节字符串类型. (4认同)

dsh*_*dsh 5

您使用的是 Python 3。您链接到有关 Python 2 的信息。

文件指出:

如概述中所述,Python 区分二进制和文本 I/O。以二进制模式打开的文件(包括 mode 参数中的“b”)将内容作为字节对象返回,无需任何解码。在文本模式下(默认情况下,或者当 't' 包含在 mode 参数中时),文件的内容作为 str 返回,首先使用平台相关编码或使用指定编码(如果给定)解码的字节。

Python 3 非常慎重考虑字节与字符(字符串)。Python 2 对此很草率,这会导致很多问题。