转换用于将base64编码的位图图像解压缩到Python 3.7的Python 2.7代码

问题描述 投票:0回答:1

我有一些在Python 2.7中工作的代码,但我现在正在尝试学习Python 3并转换几个遗留脚本。我使用base64.b64decode解码包含位图图像的文件的每一行(每行一个),然后StringIO.StringIOgzip.GzipFile解压缩为字符串。

我可能需要重新评估整个过程。如果在Python 3中有更有效的方法来实现这一点,我愿意学习它只是指向正确的方向。

我发现io已经取代了StringIO但是当我使用io.BytesIO时,我得到了关于文件标记结束的错误。另外io.StringIO给出了关于输入类型的错误,这些输入类型不是strNone

我已经尝试了几种不同的方法将io.BytesIO的输出转换回字符串,而不是试图涵盖我遇到的每一个错误让我只是说我被卡住了。

旧版Python 2.7代码:

import base64
nowtext= "c:/input_path/"
nowhtml= "c:/output_path/"
with open (nowtext, 'r') as f:
    for line in f:
        zipped= base64.b64decode(line)
        import StringIO
        sio= StringIO.StringIO(zipped)
        import gzip
        u= gzip.GzipFile(fileobj=sio)
        unzipped= u.read()
        wrapper= """<img src="data:image/bmp;base64,%s" />"""
        h= open (nowhtml,'a')
        h.write(wrapper % unzipped + '\n')

尝试转换为Python 3

import base64
nowtext= "c:/input_path/"
nowhtml= "c:/output_path/"
with open (nowtext, 'r') as f:
    for line in f:
        zipped= base64.b64decode(line)
        import io
        sio= io.BytesIO(zipped)
        import gzip
        u= gzip.decompress(sio)
        unzipped= u.read()
        wrapper= """<img src="data:image/bmp;base64,%s" />"""
        h= open (nowhtml,'a')
        h.write(wrapper % unzipped + '\n')
python python-2.7 base64 gzip python-3.7
1个回答
2
投票

您不需要将数据包装在文件对象和GzipFile()对象中进行解压缩。只需使用gzip.decompress() function直接解压缩您的数据。你的代码混淆了gzip.GZipFile()gzip.decompress();不要将一个文件对象传递给一个直接在bytes值上工作的函数。

我将假设解码数据本身是一个有效的Base64字符串(否则你的Python 2代码无法工作),所以我们需要使用ASCII编解码器解码你从解压缩得到的bytes值:

import base64
import gzip

nowtext= "c:/input_path/"
nowhtml= "c:/output_path/"

with open(nowtext, 'r') as f, open(nowhtml, 'a') as output:
    for line in f:
        unzipped = gzip.decompress(base64.b64decode(line)).decode('ascii')
        line = f'<img src="data:image/bmp;base64,{unzipped}" />\n'
        output.write(line)

请注意,我只打开一次输出文件。通过一次又一次地为每个单独的行打开文件来减慢脚本速度没有什么意义。

© www.soinside.com 2019 - 2024. All rights reserved.