Python записывает байты в файл

У меня есть функция, которая возвращает строку. Строка содержит символы возврата каретки и перевода строки (0x0D, 0x0A). Однако когда я пишу в файл, он содержит только новые переводы строк. Есть ли способ получить вывод, включающий возврат каретки и новую строку.

  msg = function (arg1, arg2, arg3) f = open ('/tmp /output ',' w ') f.write (msg) f.close ()  

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

  f = open ('/tmp/output', 'wb')  

Записать байты и создать файл, если он не существует:

  f = open ('./put/your/ path/here.png ',' wb ') f.write (data) f.close ()  

wb означает открытие файла в режим записи в двоичном формате .

2



/python-bytecode

Это приложение предоставляет возможность конвертировать файлы Python в их файлы .pyc . Файлы Python .pyc — это скомпилированные файлы Python, скомпилированные в байт-код. Если вы когда-нибудь задумывались, почему иногда Python генерирует их и папку __ pycache__ , то это из соображений производительности.

Цель этого упражнения — раскрыть внутреннюю часть Python, чтобы что некоторые люди могут экспериментировать с написанием своего собственного языка, который работает на виртуальной машине Python. Многие новейшие языки, такие как Scala и Clojure, работают на JVM. Они стали популярными, потому что сразу поставляются с включенными батареями , так сказать, потому что они способны импортировать все существующие библиотеки Java. Возможно, Python является более чистым языком, чем Java, поэтому было бы полезно иметь функциональный язык, например, который хорошо интегрируется с Python — языком, который следует принципам Pythonic (см. import this ). Я планирую работать над таким языком, но я хотел бы открыть шлюзы для всех остальных.

Генерация байт-кода ( .pyc файлы )

Файлы .pyc имеют следующую структуру:

  1. 4 байтов : Магическое число
  2. 4 байта : Отметка времени
  3. 4 байта :
  4. N байтов : Маршалированный объект кода

Вы можете заставить каждый сегмент создать файл .pyc следующими способами:

  1. магическое число соответствует требуемой версии Python. Вы можете получить этот номер с помощью модуля imp :
    import imp
    magic_number = imp.get_magic ()
  2. timestamp соответствует времени его создания. Если есть соответствующий . py , он проверяет эту отметку времени с этим файлом, чтобы увидеть, совпадают ли они. В противном случае это не имеет значения, если файл .pyc находится сам по себе. Вы можете получить это число с помощью модулей time и struct :
    import struct, time
    timestamp = struct.pack ('i', int (time.time ()))
  3. Заполнение — это просто заполнение перед объектом кода, в основном 4-байтовая последовательность нулей. Кажется, что это дополнение есть только в Python 3, поэтому опустите его для Python 2 . Иногда первый байт имеет какое-то значение, но это не кажется актуальным. Вы можете просто использовать эту строку байтов:
    b'A x00 x00 x00 '
  4. Объект кода — это упорядоченный объект кода Python. Вы можете использовать команду compile для компиляции сегмента кода Python в объект кода, чтобы сначала проверить это. Подпись команды: compile (code_segment, 'file_name', 'exec') . Вам необходимо убедиться, что имя_файла соответствует имени файла, в который вы записываете файл .pyc . Вот простой пример:
    маршал импорта
    filename = 'addnum.py'
    code_segment = 'a = 123 + 321 nprint (a)'
    code = compile (code_segment, filename, 'exec')
    marshalled_code_object = marshal.dumps (code)

Вы можете собрать все это вместе следующим образом:

  # записать в addnum.pyc с open (filename + 'c', 'wb') как f: f.write (magic_number) f.write (timestamp) f.write (padding) f.write (marshalled_code_object)   

А затем вы можете протестировать его как обычный файл Python, он должен работать!

  $ python addnum.pyc 444   

Вы можете проверить компилятор байт-кода, запустив python bytecode.py [файл .py] или pybytecode [.py файл] из командной строки.

Написание объектов кода

Вы можете писать объекты Python, импортировав тип CodeType следующим образом: из типа импорта CodeType . Вы можете просмотреть справку по необходимым параметрам ( help (CodeType) ), а также в Интернете довольно много документации по различным частям объекта кода Python. Сообщение Альберто на StackOverflow дает довольно приличный обзор каждого из них. Я включил его код как часть codegen.py . Коды операций см. В разделе ресурсов README, чтобы вы могли начать писать компилятор байт-кода для вашего собственного языка, который можно читать с помощью виртуальной машины Python!

Вы можете протестировать генератор кода, запустив python codegen.py или pycodegen из командной строки.

Resources

  • Инструкции по байт-коду Python и их описания можно найти в документации модуля dis .

  • Вы можете просмотреть все коды операций Python из исходного кода Python в файле Include/opcode.h.

  • Если есть сомнения, создайте объект кода нужного вам типа сегмента, используя code = compile (code_segment, my_file_name, 'exec') , а затем дизассемблируйте его, используя dis.dis (code) , а затем создание байт-кода путем преобразования в коды операций и соответствующие параметры (см. codegen.py и opcode.h).

  • Хотя оба из них больше не поддерживаются, вы можете проверить PEAK и Byteplay для сборки байт-кода.

Оцените статью
clickpad.ru
Добавить комментарий