Преобразование кода Python 2.7, используемого для распаковки растрового изображения в кодировке base64, в Python 3.7 - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть код, который работал в Python 2.7, но сейчас я пытаюсь выучить Python 3 и конвертировать несколько устаревших скриптов. Я использовал base64.b64decode для декодирования каждой строки файла, содержащего растровые изображения (по одному на строку), затем StringIO.StringIO и gzip.GzipFile для распаковки в виде строки.

Возможно, мне придется пересмотреть весь процесс. Если есть более эффективный способ достичь этого в Python 3, я хочу изучить его, просто укажи мне правильное направление.

Я нашел, где io заменил StringIO, но когда я использую io.BytesIO, я получаю ошибки об окончании файловых маркеров. Поочередно io.StringIO дает мне ошибки о типах ввода, которые еще не str или None.

Я пробовал несколько разных способов преобразовать вывод io.BytesIO обратно в строку, но вместо того, чтобы пытаться охватить каждую ошибку, с которой я столкнулся, скажем так, я застрял.

Legacy 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')

1 Ответ

2 голосов
/ 01 апреля 2019

Вам не нужно оборачивать данные в файловый объект плюс GzipFile() объект для распаковки. Просто распакуйте ваши данные напрямую с помощью функции gzip.decompress() . Ваш код перепутал gzip.GZipFile() и gzip.decompress(); не передавайте файловый объект, предназначенный для него, функции, которая работает непосредственно со значением bytes.

Я собираюсь предположить, что декодированные данные сами по себе являются допустимой строкой Base64 (в противном случае ваш код Python 2 мог бы не работать), поэтому нам нужно декодировать значение bytes, полученное при распаковке, с помощью кодека 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)

Обратите внимание, что я открываю выходной файл только один раз . Нет смысла тормозить ваш скрипт, открывая файл снова и снова для каждой отдельной строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...