python 3 - 读取压缩存档中的文件将'b'字符放在每行的开头

Posted

技术标签:

【中文标题】python 3 - 读取压缩存档中的文件将\'b\'字符放在每行的开头【英文标题】:python 3 - reading a file within zipped archive places 'b' character at start of each linepython 3 - 读取压缩存档中的文件将'b'字符放在每行的开头 【发布时间】:2017-07-28 14:50:46 【问题描述】:

在下面的代码中,我总是得到一个奇怪的输出,它把 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 你能把这个作为答案吗? 【参考方案1】:

在 Python 3.x 中,字符串和字节数据是有区别的。当将字节表示为字符串时,Python 添加 b 前缀来表示。如果要将bytes 视为字符串,首先需要将它们解码为字符串:

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

会给你想要的str。

【讨论】:

【参考方案3】:

在 Python 3 中,(来自文档)字节文字总是以 'b' 或 'B' 为前缀;它们生成 bytes 类型而不是 str 类型的实例。它们可能只包含 ASCII 字符;数值为 128 或更大的字节必须用转义符表示。

这只是澄清打印输出中的格式。如果你想输出没有这种格式的字符串,你可以使用这样的格式字符串:

print("%s" % myfile.readlines())

【讨论】:

以上是关于python 3 - 读取压缩存档中的文件将'b'字符放在每行的开头的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中将数据写入 zip 存档

从python中的tar存档中提取压缩的gz文件

在python中逐行读取一个大的压缩文本文件

如何使用 Python 将文件压缩为受密码保护的存档

存档/压缩文件 python

C 中的嵌入式 python:有没有办法从压缩的 python 存档中正确导入 numpy?