대부분의 프로그램은 파일에 NULL 문자 가 포함 된 경우 파일을 바이너리 ( "라인 지향"이 아닌 파일)로 간주합니다 .
다음은 Python으로 구현 된 perl의 pp_fttext()
( pp_sys.c
) 버전입니다 .
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 모두에서 실행되도록 작성되었습니다.
출처 : Python으로 구현 된 Perl의 "파일이 텍스트인지 바이너리인지 추측"