我正在尝试分析一些二进制文件,并假设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'>
个对象。
我没有得到什么?
答案 0 :(得分:5)
您可以在rb
或rt
模式下打开(默认为读取二进制,为您提供字节)。这在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的信息。
如概述中所述,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