Как распаковать содержимое var в другой var?

Я пытаюсь распаковать содержимое переменной в ту же переменную или в другую. Я создал файл .gz, используя имя файла gzip -k. Он сгенерировал имя файла.gz, сохранив оригинал. Я загрузил этот gz-файл на сервер. Следующая строка загружает файл gz в файл var. Да, я мог бы использовать пакет, требующий http и т. д.

set testvar [exec wget -q -O - url-to-gz-file]; string length $testvar

Длина строки $testvar возвращает число. Теперь мне нужно выкачать/распаковать то, что находится внутри $testvar, в ту же переменную или в другую переменную, например testvar2, и эта переменная должна содержать содержимое исходного файла. Я имею в виду содержимое файла до сжатия. Исходный файл представляет собой просто текстовый файл.

Вероятно, мне нужно указать, что testvar является двоичным.

Это возможно? Я не хочу сначала загружать файл .gz на жесткий диск, а потом обрабатывать его. Это все нужно делать «по памяти».

Спасибо.

Переменные, типы данных и операторы в Python
Переменные, типы данных и операторы в Python
В Python переменные используются как место для хранения значений. Пример переменной формы:
1
0
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Самый простой способ — просто передать wget в gunzip:

set result [exec wget -q -O - url-to-gz-file | gunzip -c]

Для этого необходимо, чтобы несжатое содержимое было закодировано в кодировке символов вашей системы по умолчанию; если это двоичные данные или какая-либо другая текстовая кодировка, у вас возникнут проблемы (Ваша переменная teststr, вероятно, не содержит действительных данных gzip из-за перевода кодировки символов).

В таких случаях tcl поставляется с командой zlib для работы со сжатием zlib и gzip. В частности, здесь будет полезна подкоманда zlib gunzip STRING. Для этого вам нужно использовать open, а не exec, чтобы получить двоичные данные, которые можно передать в zlib gunzip. Это будет выглядеть примерно так:

# b for opening in binary mode instead of having to set it with fconfigure
set wget [open "| wget -q -O - url-to-gz-file" rb]
set binData [zlib gunzip [read -nonewline $wget]]
close $wget
set result [encoding convertfrom utf-8 $binData] ;# Or whatever encoding the file uses

Вы можете использовать zlib push, чтобы добавить слой в канал wget, чтобы использование read на нем также автоматически распаковывало данные.

set wget [open "| wget -q -O - url-to-gz-file" rb]
zlib push gunzip $wget
set result [encoding convertfrom utf-8 [read -nonewline $wget]]
close $wget

Вы также можете совместить открытие конвейера с настройкой кодировки текста. Есть более одного способа сделать это не только для Perl.

Shawn 20.03.2024 23:11

Преобразования канала действуют на стороне двоичных данных канала. Вероятно, вам не понадобится encoding convertfrom при использовании zlib push gunzip.

Donal Fellows 22.03.2024 13:05

@DonalFellows Я тестировал это; это было необходимо.

Shawn 22.03.2024 16:38

Если подумать, интересно, сделал бы fconfigure -encoding это.

Shawn 22.03.2024 18:08

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