【问题标题】:Converting Python 2.7 code used to decompress a base64 encoded bitmap image to Python 3.7将用于解压缩 base64 编码位图图像的 Python 2.7 代码转换为 Python 3.7
【发布时间】:2019-04-01 16:00:58
【问题描述】:

我有一些在 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')

【问题讨论】:

  • 不是严格的主题,但在此代码上使用一些代码修复程序,importfor 循环让我失明了。
  • 如果您添加一两行示例输入数据和 HTML 的预期输出行,将会很有帮助。我建议您使用 非常小的 图像。
  • @SzymonMaszke 抱歉,感谢您的反馈,仍在学习中。完整的脚本将近 1k 行,因此当我需要更改模块或更新部分代码时,将导入放在开头或距离使用它们太远会让我感到困惑。我不确定最佳实践是什么,但我读到如果模块已经导入,它会再次跳过导入。
  • 不使用 1k 行并将您的代码分成更小且有意义的块(模块)将是一个好的开始。没有伤害,我只是半盲。 :D

标签: python python-2.7 base64 gzip python-3.7


【解决方案1】:

您无需将数据包装在文件对象和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)

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

【讨论】:

  • 我对 python 还是很陌生,所以这让我有点震惊。非常感谢。我需要一点时间才能完全解开它以及它将如何改变我未来的方法。
猜你喜欢
  • 1970-01-01
  • 2011-10-21
  • 2018-11-22
  • 2016-12-14
  • 2014-03-04
  • 2011-04-27
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多