Как распаковать закодированные данные base 64 внутри JSON с помощью Python?

Я использую Selenium Grid, и мне нужно загрузить файлы для загрузки автоматических тестов. Я столкнулся с проблемой, когда ответ не является самим содержимым файла. Вместо этого содержимое сначала заархивируется, а затем упаковано в JSON.

Вот ответ, который я пытаюсь разархивировать:

b'{\n  "filename": "test.txt",\n  "contents": "UEsDBBQACAgIAFV1TlYAAAAAAAAAAAAAAAAIAAAAdGVzdC50eHQDAFBLBwgAAAAAAgAAAAAAAABQSwECFAAUAAgICABVdU5WAAAAAAIAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAdGVzdC50eHRQSwUGAAAAAAEAAQA2AAAAOAAAAAAA"\n}'

Приведенные выше данные должны содержать пустой файл с именем test.txt.

Согласно документации, содержимое представляет собой заархивированную папку в кодировке Base64. Я хочу иметь возможность разархивировать эту строку и прочитать содержимое файла test.txt внутри, но я не уверен, как разархивировать байтовую строку с кодировкой base 64.

Я использую Python, поэтому, если кто-нибудь знает, как распаковать содержимое и прочитать файл test.txt, это будет чрезвычайно полезно.

Вот документация по Selenium Grid для загрузки файлов: https://www.selenium.dev/documentation/grid/configuration/cli_options/#important-information-when-dowloading-a-file

Поле contents представляет собой zip-файл в кодировке base64. Итак, сначала превратите это обратно в байты (тонны ответов, которые помогут вам сделать это уже на SO), а затем запустите его через распаковку (опять же, тонны ответов, которые уже объясняют, как это сделать на SO).

Mike 'Pomax' Kamermans 14.02.2023 23:03

И, конечно же, сначала распакуйте строку JSON в словарь Python.

mkrieger1 14.02.2023 23:17
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Отказ от ответственности: Эта статья предназначена только для демонстрации и не должна использоваться в качестве инвестиционного совета.
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Потяните за рычаг выброса энергососущих проектов
Потяните за рычаг выброса энергососущих проектов
На этой неделе моя команда отменила проект, над которым я работал. Неделя усилий пошла насмарку.
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
0
2
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно будет b64decode содержимое после анализа json, а затем сохранить результат либо во временном файле, либо в объекте BytesIO , чтобы его можно было использовать с ZipFile:

import json
from base64 import b64decode
from io import BytesIO
from pathlib import Path
from zipfile import ZipFile

data = b'{\n  "filename": "test.txt",\n  "contents": "UEsDBBQACAgIAFV1TlYAAAAAAAAAAAAAAAAIAAAAdGVzdC50eHQDAFBLBwgAAAAAAgAAAAAAAABQSwECFAAUAAgICABVdU5WAAAAAAIAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAdGVzdC50eHRQSwUGAAAAAAEAAQA2AAAAOAAAAAAA"\n}'

contents = json.loads(data)['contents']
bio = BytesIO(b64decode(contents))

Затем мы можем увидеть метаданные о файлах, хранящихся в этом zip-файле (этот шаг не требуется):

>>> with ZipFile(bio) as zip_file:
...     zip_file.infolist()
...
[<ZipInfo filename='test.txt' compress_type=deflate file_size=0 compress_size=2>]

Чтобы извлечь все файлы, вы можете использовать метод extractall:

>>> path = Path('temp/extracted')

>>> path.mkdir()

>>> with ZipFile(bio) as zip_file:
...     zip_file.extractall(path)
...

>>> for p in path.iterdir():
...     print(p.as_posix())
...
temp/extracted/test.txt

При желании также можно извлечь отдельные файлы.

Другие вопросы по теме