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'字符放在每行的开头的主要内容,如果未能解决你的问题,请参考以下文章