首页 > 解决方案 > python3 zip 将 gzipped 文本文件读取为字节字符串,但 python2 izip 读取为普通字符串

问题描述

同样,我正在将 python2 代码转换为 python3。当我用 zip 替换 itertools.izip 时遇到了麻烦。这是一个例子:

我有两个压缩文本文件: data1.txt.gz 与内容

a
b

和data2.txt.gz

e
f

python2 izip版本

from itertools import izip
import sys
import gzip

def read(file):
  fh = gzip.open(file,"rb")
  with fh as f:
    while True:
      l1 = f.readline()
      if not l1:
        break
      l2 = f.readline()
      yield [l1, l2]

for a,b in izip(read("data1.txt.gz"),read("data2.txt.gz")):
  sys.stdout.write("%s\n%s\n" % (a,b))

这显示了一个输出

['a\n', 'b\n']
['e\n', 'f\n']

但是,对于 python3 zip 版本:

import sys
import gzip

def read(file):
  fh = gzip.open(file,"rb")
  with fh as f:
    while True:
      l1 = f.readline()
      if not l1:
        break
      l2 = f.readline()
      yield [l1, l2]

for a,b in zip(read("data1.txt.gz"),read("data2.txt.gz")):
  sys.stdout.write("%s\n%s\n" % (a,b))

输出变为:

[b'a\n', b'b\n']
[b'e\n', b'f\n']

为什么?

这导致我的程序在那之后崩溃。为了解决这个问题,我可以添加

a = list(map(bytes.decode,a))
b = list(map(bytes.decode,b))

在 for 语句之后。据推测,这看起来不太好,可能也更慢但是有没有更好看和更快的方法来做到这一点?提前非常感谢。

标签: python-3.xgzip

解决方案


在我使用 python3 的系统上:

>>> import gzip
>>> sample_zip_file = 'x1.txt.gz'
>>> 
>>> fh_textmode = gzip.open(sample_zip_file, 'rt')
>>> fh_binarymode = gzip.open(sample_zip_file, 'rb')
>>> 
>>> data_textmode = fh_textmode.read()
>>> data_binarymode = fh_binarymode.read()
>>> 
>>> type(data_textmode)
<class 'str'>
>>> type(data_binarymode)
<class 'bytes'>
>>> 

推荐阅读