Python 3 - 在压缩存档中读取文件时,每行开头会出现 'b' 字符

5
在下面的代码中,我总是得到一个奇怪的输出,每一行开头都有一个 b 。仅仅是字母 b。
例如,样本输出如下:
[b'2017-06-01,15:19:57,']

这段脚本如下:
from zipfile import ZipFile

with ZipFile('myarchive.zip','r') as myzip:
    with myzip.open('logs/logfile1.txt') as myfile:
        next(myfile)
        print(myfile.readlines())

归档文件中只有一个名为“logs”的文件夹,在文件夹内有几个文本文件,每个文件的第一行为空行(因此需要使用next(myfile)跳过空行)。

它将b放在数据之前,无论我尝试读取哪个文件。如果文件中有多行,它会输出类似于以下内容:

[b'2017-06-01,15:06:28,start session: \n', b'2017-06-01,15:06:36,stop session']

为什么它要把讨人厌的b放在那里?

@zwer,你能把这个作为答案吗? - omrakhur
3个回答

10
在Python 3.x中,字符串和字节数据是有区别的。当用字符串表示字节时,Python会添加b前缀以示区别。如果你想将你的字节数据视为字符串来处理,则需要先将它们解码为字符串:

在Python 3.x中,字符串和字节数据有所不同。当用字符串表示字节时,Python会添加b前缀以示区别。如果您想将字节视为字符串进行处理,则需要首先对其进行解码:

your_string = your_bytes.decode("utf-8") 

当然,你使用的编解码器取决于首次将字符串编码为字节的方式。


2

因为zip是二进制格式,读取时返回的是bytes而不是str

你可以使用str.decode()进行转换。

例如:

>>>byte_string = b'2017-06-01,15:06:28,start session: \n'
>>>byte_string.decode()
2017-06-01,15:06:28,start session: \n

将会为您提供所需的字符串。

1
在Python 3中,(来自文档)字节文字始终以“b”或“B”为前缀;它们生成字节类型的实例而不是str类型。它们只能包含ASCII字符;具有128或更高数值的字节必须使用转义表示。
这只是澄清打印输出中的格式。如果您想输出没有此格式的字符串,可以使用以下格式字符串:
print("%s" % myfile.readlines())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接