python3 zip 将 gzip 文本文件读取为字节字符串,但 python2 izip 读取为普通字符串
python3 zip reads gzipped text file as bytes string but python2 izip read as normal string
同样,我正在 运行 将 python2 代码转换为 python3。当我用 zip 替换 itertools.izip 时,我 运行 遇到了麻烦。这是一个例子:
我有两个 gzip 文本文件:
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 语句之后。
据推测,这看起来不太好,也可能更慢
但是有更好看和更快的方法来做到这一点吗?
非常感谢。
在我的系统上 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'>
>>>
同样,我正在 运行 将 python2 代码转换为 python3。当我用 zip 替换 itertools.izip 时,我 运行 遇到了麻烦。这是一个例子:
我有两个 gzip 文本文件: 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 语句之后。 据推测,这看起来不太好,也可能更慢 但是有更好看和更快的方法来做到这一点吗? 非常感谢。
在我的系统上 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'>
>>>