将用于解压base64编码位图图像的Python 2.7代码转换为Python 3.7
我有一些在Python2.7中工作的代码,但我现在正在尝试学习Python3并转换一些遗留脚本。我使用将用于解压base64编码位图图像的Python 2.7代码转换为Python 3.7,python,python-2.7,base64,gzip,python-3.7,Python,Python 2.7,Base64,Gzip,Python 3.7,我有一些在Python2.7中工作的代码,但我现在正在尝试学习Python3并转换一些遗留脚本。我使用base64.b64解码对包含位图图像的文件的每行进行解码(每行一个),然后StringIO.StringIO和gzip.gzip文件将其解压缩为字符串 我可能需要重新评估整个过程。如果在Python3中有更有效的方法来实现这一点,我愿意学习它,只要为我指明正确的方向就行了 我已经找到io替换了StringIO的位置,但是当我使用io.BytesIO时,我得到了关于文件结尾标记的错误。或者,io
base64.b64解码
对包含位图图像的文件的每行进行解码(每行一个),然后StringIO.StringIO
和gzip.gzip文件
将其解压缩为字符串
我可能需要重新评估整个过程。如果在Python3中有更有效的方法来实现这一点,我愿意学习它,只要为我指明正确的方向就行了
我已经找到io替换了StringIO
的位置,但是当我使用io.BytesIO
时,我得到了关于文件结尾标记的错误。或者,io.StringIO
会给出关于尚未str
或None
的输入类型的错误
我尝试了几种不同的方法将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')
导入base64
nowtext=“c:/input\u path/”
nowhtml=“c:/output\u path/”
将open(nowtext,'r')作为f:
对于f中的行:
zipped=base64.b64解码(行)
导入StringIO
sio=StringIO.StringIO(拉链式)
导入gzip
u=gzip.gzip文件(fileobj=sio)
解压=u.read()
包装器=“”
h=打开(nowhtml,'a')
h、 写入(包装%Unzip+'\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')
导入base64
nowtext=“c:/input\u path/”
nowhtml=“c:/output\u path/”
将open(nowtext,'r')作为f:
对于f中的行:
zipped=base64.b64解码(行)
输入io
sio=io.BytesIO(拉链式)
导入gzip
u=gzip.减压(sio)
解压=u.read()
包装器=“”
h=打开(nowhtml,'a')
h、 写入(包装%Unzip+'\n')
您不需要将数据包装在文件对象和要解压缩的GzipFile()
对象中。只需直接解压缩数据,使用。您的代码混淆了gzip.gzip文件()
和gzip.decompress()
;不要将用于文件对象的文件对象传递给直接处理字节
值的函数
我将假设解码后的数据本身是一个有效的Base64字符串(否则Python 2代码将无法工作),因此我们需要使用ASCII编解码器对从解压缩中获得的字节
值进行解码:
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)
导入base64
导入gzip
nowtext=“c:/input\u path/”
nowhtml=“c:/output\u path/”
以open(nowtext,'r')作为f,open(nowthtml,'a')作为输出:
对于f中的行:
解压=gzip.decompress(base64.b64解码(行)).decode('ascii')
行=f'\n'
输出。写入(行)
请注意,我只打开了一次输出文件。通过为每一行反复打开文件来降低脚本速度是没有什么意义的。您不需要将数据包装在文件对象加上要解压缩的
GzipFile()
对象中。只需直接解压缩数据,使用。您的代码混淆了gzip.gzip文件()
和gzip.decompress()
;不要将用于文件对象的文件对象传递给直接处理字节
值的函数
我将假设解码后的数据本身是一个有效的Base64字符串(否则Python 2代码将无法工作),因此我们需要使用ASCII编解码器对从解压缩中获得的字节
值进行解码:
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)
导入base64
导入gzip
nowtext=“c:/input\u path/”
nowhtml=“c:/output\u path/”
以open(nowtext,'r')作为f,open(nowthtml,'a')作为输出:
对于f中的行:
解压=gzip.decompress(base64.b64解码(行)).decode('ascii')
行=f'\n'
输出。写入(行)
请注意,我只打开了一次输出文件。通过一次又一次地为每一行打开文件来减慢脚本速度是没有什么意义的。这不是严格意义上的主题,但请在此代码上使用一些代码修复程序,
import
insidefor
loop让我看不见。如果您添加一两行示例输入数据和HTML的预期输出行,这会很有帮助。我建议您使用非常小的图像来处理这些内容。@SzymonMaszke抱歉,感谢您的反馈,仍在学习中。完整的脚本几乎有1k行,所以当我需要更改模块或更新部分代码时,将导入放在开始位置或离使用它们的时间太远会让我感到困惑。我不确定什么是最佳实践,但我了解到,如果模块已经导入,它将跳过再次导入。不使用1k行并将代码分成更小且有意义的块(模块),这将是一个良好的开端。没有造成伤害,我只是半瞎了眼DNot严格按照主题,但请在此代码上使用一些代码修复程序,import
insidefor
循环使我失明。如果您添加一两行示例输入数据和HTML的预期输出行,这将很有帮助。我建议您使用非常小的图像来处理这些内容。@SzymonMaszke抱歉,感谢您的反馈,仍在学习中。完整的脚本几乎有1k行,所以当我需要更改模块或更新部分代码时,将导入放在开始位置或离使用它们的时间太远会让我感到困惑。我不确定什么是最佳实践,但我了解到,如果模块已经导入,它将跳过再次导入。不使用1k行并将代码分成更小且有意义的块(模块),这将是一个良好的开端。没有造成伤害,我只是半瞎了眼我对python还是相当陌生,所以这让我有点吃惊。非常感谢,它工作得非常好。我需要花一点时间来完全解压它,以及它将如何改变我未来的方法。我对python还是相当陌生,所以这让我有点震惊。非常感谢,它工作得非常好。我需要花一点时间才能完全解开这个包裹,它将如何改变我的fu