Питон-эквивалент утилиты unix "strings"

Я пытаюсь написать сценарий, который будет извлекать строки из исполняемого двоичного файла и сохранять их в файле. Если этот файл не разделен на новую строку, это не вариант, поскольку строки могут иметь новые строки. Это также означает, однако, что использование утилиты unix «strings» не является опцией, поскольку она просто печатает все строки, разделенные символом новой строки, что означает, что нет способа определить, какие строки включают в себя строки новой строки, просто взглянув на вывод «струна». Таким образом, я надеялся найти функцию или библиотеку python, которая реализует ту же функциональность «строк», но которая даст мне эти строки как переменные, чтобы я мог избежать проблемы с новой строкой.

Благодаря!

  • Компиляция Python в собственный код?
  • запуск внешней программы (исполняемый файл) в python?
  • Как сделать автономный исполняемый файл Python для запуска без ЛЮБОЙ зависимости?
  • Как скомпилировать скрипт python для двоичного исполняемого файла
  • Создать единый исполняемый модуль на Python
  • Как скомпилировать скрипт PyQt (.py) в один отдельный исполняемый файл для windows (.exe) и / или linux?
  • Создание `assert` Python создает исключение, которое я выбираю
  • Как Python может получать двоичные данные (char *) из C ++ by SWIG?
  • Перемещение элементов в списках в python
  • разные поля для добавления и изменения страниц в admin
  • NoBrokersAvailable: NoBrokersAvailable-Kafka Ошибка
  • Как правильно сообщать о статусе выхода в пакетном режиме?
  • 3 Solutions collect form web for “Питон-эквивалент утилиты unix "strings"”

    Вот генератор, который дает все строки печатаемых символов> = min (4 по умолчанию) в длину, которые он находит в filename :

     import string def strings(filename, min=4): with open(filename, errors="ignore") as f: # Python 3.x # with open(filename, "rb") as f: # Python 2.x result = "" for c in f.read(): if c in string.printable: result += c continue if len(result) >= min: yield result result = "" if len(result) >= min: # catch result at EOF yield result 

    Что вы можете перебрать:

     for s in strings("something.bin"): # do something with s 

    … или сохранить в списке:

     sl = list(strings("something.bin")) 

    Я проверил это очень кратко и, похоже, получил тот же результат, что и команда strings Unix для произвольного двоичного файла, который я выбрал. Однако это довольно наивно (для начала он сразу считывает весь файл в память, что может быть дорогостоящим для больших файлов), и вряд ли приблизится к производительности команды Unix strings .

    Процитировать man strings :

     STRINGS (1) Инструменты разработки GNU STRINGS (1)
    
     ИМЯ
            string - печатать строки печатаемых символов в файлах.
    
     [...]
     ОПИСАНИЕ
            Для каждого указанного файла строки GNU печатают печатный символ
            последовательности длиной не менее 4 символов (или число, указанное с
            варианты ниже), за которым следует непечатаемый символ.  От
            default, он только печатает строки из инициализированных и загруженных
            разделы объектных файлов;  для других типов файлов он печатает
            строки из всего файла.
    

    Вы можете добиться аналогичного результата, используя regex совпадающее не менее чем с 4 печатными символами. Что-то вроде того:

     >>> import re >>> content = "hello,\x02World\x88!" >>> re.findall("[^\x00-\x1F\x7F-\xFF]{4,}", content) ['hello,', 'World'] 

    Обратите внимание, что это решение требует загрузки всего содержимого файла в память.

    Вы можете использовать пакет csv, который управляет новыми строками в строках. Вам просто нужна одна колонка.

    Python - лучший язык программирования в мире.