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

时间:2016-04-11 18:56:01

标签: python python-3.x file-io

我正在尝试分析一些二进制文件,并假设Python的read()函数从此article和教程点article返回了一个字符串。

然而,当我自己弄乱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'>
>>> 

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

我没有得到什么?

3 个答案:

答案 0 :(得分:5)

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

中提到
  

模式参数可以是“r”,“rb”,“w”,“wb”,“x”,“xb”,“a”或“ab”   二进制模式,或文本模式的“rt”,“wt”,“xt”或“at”。默认模式是   “rb”,默认的compresslevel是9。

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

答案 1 :(得分:4)

您正在使用Python 3.您链接到有关Python 2的信息。

documentation州:

  

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

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

答案 2 :(得分:0)

a = f.read()
str_data = a.decode("utf-8")

这对我有用,但是我也从.txt而不是.gz读取 Python3