โปรแกรมส่วนใหญ่จะพิจารณาว่าไฟล์เป็นไบนารี (ซึ่งเป็นไฟล์ใด ๆ ที่ไม่ใช่ "line-oriented") หากมีอักขระ NULLตัวละครที่เป็นโมฆะ
นี่คือเวอร์ชันpp_fttext()
( pp_sys.c
) ของ perl ที่ใช้งานใน Python:
import sys
PY3 = sys.version_info[0] == 3
# A function that takes an integer in the 8-bit range and returns
# a single-character byte object in py3 / a single-character string
# in py2.
#
int2byte = (lambda x: bytes((x,))) if PY3 else chr
_text_characters = (
b''.join(int2byte(i) for i in range(32, 127)) +
b'\n\r\t\f\b')
def istextfile(fileobj, blocksize=512):
""" Uses heuristics to guess whether the given file is text or binary,
by reading a single block of bytes from the file.
If more than 30% of the chars in the block are non-text, or there
are NUL ('\x00') bytes in the block, assume this is a binary file.
"""
block = fileobj.read(blocksize)
if b'\x00' in block:
# Files with null bytes are binary
return False
elif not block:
# An empty file is considered a valid text file
return True
# Use translate's 'deletechars' argument to efficiently remove all
# occurrences of _text_characters from the block
nontext = block.translate(None, _text_characters)
return float(len(nontext)) / len(block) <= 0.30
โปรดทราบว่าโค้ดนี้เขียนขึ้นเพื่อให้ทำงานบนทั้ง Python 2 และ Python 3 โดยไม่มีการเปลี่ยนแปลง
ที่มา: "เดาว่าไฟล์เป็นข้อความหรือไบนารี" ของ Perl ถูกนำไปใช้ใน Python