How can I detect if a file is binary (non-text) in Python?

You can also use the mimetypes module:

import mimetypes
mime = mimetypes.guess_type(file)

It's fairly easy to compile a list of binary mime types. For example Apache distributes with a mime.types file that you could parse into a set of lists, binary and text and then check to see if the mime is in your text or binary list.

Yet another method based on file(1) behavior:

>>> textchars = bytearray({7,8,9,10,12,13,27} | set(range(0x20, 0x100)) - {0x7f})
>>> is_binary_string = lambda bytes: bool(bytes.translate(None, textchars))


>>> is_binary_string(open('/usr/bin/python', 'rb').read(1024))
>>> is_binary_string(open('/usr/bin/dh_python3', 'rb').read(1024))