Как записать двоичные данные в стандартный вывод в Python 3?

StackOverflow https://stackoverflow.com/questions/908331

  •  05-09-2019
  •  | 
  •  

Вопрос

В Python 2.x я мог бы сделать это:

import sys, array
a = array.array('B', range(100))
a.tofile(sys.stdout)

Однако теперь я получаю TypeError: can't write bytes to text stream.Есть ли какая-то секретная кодировка, которую мне следует использовать?

Это было полезно?

Решение

Лучший способ:

import sys
sys.stdout.buffer.write(b"some binary data")

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

import os
os.write(1, a.tostring())

или, os.write(sys.stdout.fileno(), …) если это более читабельно, чем 1 для тебя.

Идиоматический способ сделать это, доступный только для Python 3:

with os.fdopen(sys.stdout.fileno(), "wb", closefd=False) as stdout:
    stdout.write(b"my bytes object")
    stdout.flush()

Хорошая часть заключается в том, что он использует обычный интерфейс файловых объектов, к которому все привыкли в Python.

Обратите внимание, что я устанавливаю closefd=False чтобы избежать закрытия sys.stdout при выходе из with блокировать.В противном случае ваша программа больше не сможет печатать на стандартный вывод.Однако для других типов файловых дескрипторов вы можете пропустить эту часть.

Если вы хотите указать кодировку в Python3, вы все равно можете использовать команду bytes, как показано ниже:

import os
os.write(1,bytes('Your string to Stdout','UTF-8'))

где 1 — соответствующий обычный номер для стандартного вывода -> sys.stdout.fileno()

В противном случае, если вас не волнует кодировка, просто используйте:

import sys
sys.stdout.write("Your string to Stdout\n")

Если вы хотите использовать os.write без кодировки, попробуйте использовать следующее:

import os
os.write(1,b"Your string to Stdout\n")
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top