python-3.x - 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 语句之后。据推测,这看起来不太好,可能也更慢但是有没有更好看和更快的方法来做到这一点?提前非常感谢。
解决方案
在我使用 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'>
>>>
推荐阅读
- node.js - WebRTC:在 NodeJS 和 JavaScript 应用程序中的屏幕共享和网络摄像头之间无缝切换
- c# - 如何使用缓冲区和多线程在大型文本文件中搜索字符串
- python - 带条件的循环不结束 vs 带 if 语句的循环
- angular - Angular Firebase 后台推送通知
- ruby - 如何在 Ruby 的 attr_reader 和 attr_writer 中使用变量@@?
- rust - 我如何在我的系统中访问世界?(锈+军团)
- c++ - 是否可以通过 clang-format 格式化概念
- python - raise CompileError(msg) ImportError: Building module msanomalydetector._anomaly_kernel_cython failed
- php - 修改 wordpress 小部件
- dart - 在 Dart 中使用固定参数初始化超级构造函数的最佳方法?