How to write binary data to stdout in python 3?

python write binary string to file
sys.stdout.buffer.write python 2
python binary data
python 3 bytes to string
sys stdout buffer write flush
python read binary file
python read binary file into array
python print raw bytes

In python 2.x I could do this:

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

Now however, I get a TypeError: can't write bytes to text stream. Is there some secret encoding that I should use?

A better way:

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

how to write bytes to stdout in python3.3, However, since Python 3 all strings (type str) are encoded in Unicode and the print() function does not print binary data (types bytes or  An idiomatic way of doing so, which is only available for Python 3, is: with os.fdopen(sys.stdout.fileno(), "wb", closefd=False) as stdout: stdout.write(b"my bytes object") stdout.flush() The good part is that it uses the normal file object interface, which everybody is used to in Python. Notice that I'm setting closefd=False to avoid closing sys.stdout when exiting the with block.

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

or, os.write(sys.stdout.fileno(), …) if that's more readable than 1 for you.

Python 3: Write to stdout in binary mode, write('0o377') to write a byte with all the bits turned on. When I try this, I get an error like: sys.stdout.write(data) File "/usr/local/lib/python3. Python 3: Write to stdout in binary mode This entry was posted in Uncategorized and tagged payload python snippet on February 19, 2014 by needsch Python scripts are often used to generate payloads for attacks, e.g. buffer overflows.

An idiomatic way of doing so, which is only available for Python 3, is:

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

The good part is that it uses the normal file object interface, which everybody is used to in Python.

Notice that I'm setting closefd=False to avoid closing sys.stdout when exiting the with block. Otherwise, your program wouldn't be able to print to stdout anymore. However, for other kind of file descriptors, you may want to skip that part.

Issue 4571: write to stdout in binary mode - is it possible?, Python2 does the thing more-or-less right and allows writing both text and binary. I think Python3 should also accept both. msg193404 - (view)  But this is a problem for a program that wants to write binary data to standard output (as a web CGI program would be expected to do), since the 'sys' module opens the 'stdout' file object on your behalf and normally does so in text mode.

In case you would like to specify an encoding in python3 you can still use the bytes command like below:

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

where 1 is the corresponding usual number for stdout --> sys.stdout.fileno()

Otherwise if you don't care of the encoding just use:

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

If you want to use the os.write without the encoding, then try to use the below:

import os
os.write(1,b"Your string to Stdout\n")

Issue 18512: sys.stdout.write does not allow bytes in Python 3.x , In python 2.x I could do this: import sys, array a = array.array('B', range(100)) a.​tofile(sys.stdout) Now however, I get a TypeError: can't write bytes to text stream. Using io.TextIOBase.detach () streams can be made binary by default. This function sets stdin and stdout to binary: def make_streams_binary (): sys.stdin = sys.stdin.detach () sys.stdout = sys.stdout.detach () Therefore, the corresponding idiom for Python 3.1 and later is:

How to write binary data to stdout in python 3?, By default, Python sys.stdout is opened in text mode. So, if you want to write binary data to it, sys.stdout may product unexpected In Python 3. Browse other questions tagged python python-3.x cgi binary-data or ask your own question. Featured on Meta Update: an agreement with Monica Cellio

Python - 2.5 - Writing binary to stdout, e.g.: import sys data = sys.stdin.buffer.read() print(len(data)) sys.stdout.buffer.​write(data). View entire discussion ( 4 comments). More posts from the learnpython  The following are code examples for showing how to use sys.stdout.write().They are from open source Python projects. You can vote up the examples you like or vote down the ones you don't like.

How to do stdin and stdout in binary? : learnpython, Video: Bytes and Bytearray tutorial for Python 3; The Bytes Type; The Bytearray Type; The BytesIO Class. Working with files. Writing binary_file.write("Write text by encoding\n".encode('utf8')) sys.stdout.write(chr(x)) else: In Python, files are opened in text mode by default. To open files in binary mode, when specifying a mode, add 'b' to it. For example f = open('my_file', 'w+b') byte_arr = [120, 3, 255, 0, 100] binary_format = bytearray(byte_arr) f.write(binary_format) f.close()

Comments
  • It would be much better to find an answer that will work with Python 2.6+ and 3.x
  • os.write will work on both Py2 and Py3.
  • Using sys.stdout.buffer also lets you do things like using shutil.copyfileobj even when the source file object gives bytes, and not strings. +1
  • Programs using this can't be tested in IDLE 3: AttributeError: 'PseudoOutputFile' object has no attribute 'buffer'
  • @DamianYerrick in IDLE (in Windows at least) pythonw.exe runs IDLE, which means that there is no stdout. It is emulated with tkinter. It physically can't handle bytes. In this case, .decode('UTF-8', errors='replace') your string, or run python3 -I <filename> to get a REPL instead of using IDLE.
  • Messes up order of writes when writing to stderr if using along with print(file=sys.stderr).
  • Thanks, that worked. Feels a bit hack-ish but I guess it's not that common thing to do.
  • The problem with os.write is that you'll have to check the return value, as it doesn't guarantee that everything will be written.
  • Why do you flush? Isn't it better to let Python decide when to flush stdout?
  • Programs using os.write(sys.stdout.fileno(), some_bytes) won't work in IDLE. io.UnsupportedOperation: fileno
  • @DamianYerrick: You are right...the IDLE should not be used anyway to test something like that. Shortly: try to open the IDLE (I had the python3.5.1 shell) and simply import sys and sys.stdout.fileno() it will throw you io error, because in IDLE this is not supported operation :-) It is always important to remember in which environment you are working and try to get what is possible ;) Hope this clarify your query :-) Have a nice weekend.
  • You only mention one way of writing actual binary data to stdout, the last one.