Мне нужна помощь в преобразовании кода Perl "распаковать" в код Python - PullRequest
1 голос
/ 28 апреля 2020

Я пытаюсь создать программу Python, которая делает то же самое, что и программа Perl. Я знаю, что Python имеет функцию распаковки, такую ​​как Perl, но я не могу определить формат.

Perl код :

open(TSK_FILE,"<$tsk_file_name") or die("Failed to open $tsk_file_name\n");
binmode TSK_FILE;
$all = do { local $/; <TSK_FILE> };
close(TSK_FILE);

$temp_str = unpack("A20",$all); # I want to cover these two lines
print(" Operator Name : $temp_str\n"); 

Python код :

try:
    with open(tsk_file_name, 'rb')as TSK_File:
        all = TSK_File.read()
    print(all)
except IOError:
    print('There was an error opening the file!')
    return

temp_str = struct.unpack('c', ) # I got stuck here

Редактировать :

Perl документация для распаковки : https://www.tutorialspoint.com/perl/perl_unpack.htm

"Эта функция распаковывает двоичную строку STRING, используя формат, указанный в шаблоне."

Формат: unpack TEMPLATE, STRING

Python Документация для распаковки : https://docs.python.org/3/library/struct.html

Изображение из: https://www.educative.io/edpresso/what-is-the-python-struct-module

enter image description here


Редактировать 2

Когда я читаю двоичный файл с помощью f.read (), это то, что печатается.

enter image description here

Ответы [ 2 ]

2 голосов
/ 28 апреля 2020

В Perl шаблон A20 означает «20-символьная строка ASCII с пробелами». Ближайший Python аналог 20s. (Формат c предназначен для одиночных символов, а не строк.) Вы хотите:

temp_str = struct.unpack('20s', all)

Тем не менее, pack / unpack предназначены для двоичных данных; Ваш пример выглядит так, как будто файл действительно текстовый. Если это так, было бы проще прочитать его как текст и вообще не распаковывать.

0 голосов
/ 28 апреля 2020

Я согласен с Майклом, похоже, что вы имеете дело с текстовыми данными, если это так, вы можете просто вытянуть две строки следующим образом:


with open(tsk_file_name, 'r')as tsk_file:
    first_line = next(tsk_file)
    second_line = next(tsk_file)

...