Em python 2.x, eu poderia fazer isso:
import sys, array
a = array.array('B', range(100))
a.tofile(sys.stdout)
Agora, porém, recebo um TypeError: can't write bytes to text stream
. Existe alguma codificação secreta que devo usar?
python
python-3.x
Ivan Baldin
fonte
fonte
os.write
funcionará em Py2 e Py3.Respostas:
Uma maneira melhor:
fonte
sys.stdout.buffer
também permite fazer coisas como usar,shutil.copyfileobj
mesmo quando o objeto do arquivo de origem fornece bytes, e não strings. +1AttributeError: 'PseudoOutputFile' object has no attribute 'buffer'
pythonw.exe
executa o IDLE, o que significa que não há stdout. Ele é emulado com tkinter. Ele fisicamente não pode lidar com bytes. Neste caso,.decode('UTF-8', errors='replace')
sua string ou executepython3 -I <filename>
para obter um REPL em vez de usar o IDLE.stderr
se usar junto comprint(file=sys.stderr)
.ou,
os.write(sys.stdout.fileno(), …)
se for mais legível do que1
para você.fonte
os.write
é que você terá que verificar o valor de retorno, pois isso não garante que tudo será escrito.Uma maneira idiomática de fazer isso, que está disponível apenas para Python 3, é:
A parte boa é que ele usa a interface de objeto de arquivo normal, com a qual todos estão acostumados em Python.
Observe que estou definindo
closefd=False
para evitar o fechamentosys.stdout
ao sair dowith
bloco. Caso contrário, seu programa não seria mais capaz de imprimir em stdout. No entanto, para outros tipos de descritores de arquivo, você pode querer pular essa parte.fonte
Caso queira especificar uma codificação em python3, você ainda pode usar o comando bytes como abaixo:
onde 1 é o número usual correspondente para stdout -> sys.stdout.fileno ()
Caso contrário, se você não se importar com a codificação, use:
Se você deseja usar o os.write sem a codificação, tente usar o seguinte:
fonte
os.write(sys.stdout.fileno(), some_bytes)
não funcionam no IDLE.io.UnsupportedOperation: fileno
stdout
, a última.