Подтвердить что ты не робот

Как определить бинарные и текстовые файлы с помощью Python?

Мне нужно определить, какой файл двоичный и который является текстом в каталоге.

Я пробовал использовать mimetypes, но это не хорошая идея в моем случае, потому что он не может идентифицировать все файлы mimes, и у меня есть незнакомые люди здесь... Мне просто нужно знать, бинарно или текст. Просто? Но я не мог найти решение...

Спасибо

4b9b3361

Ответ 1

Спасибо всем, я нашел решение, которое соответствовало моей проблеме. Я нашел этот код в http://code.activestate.com/recipes/173220/, и я изменил только маленький кусочек, который мне подойдет.

Он отлично работает.

from __future__ import division
import string 

def istext(filename):
    s=open(filename).read(512)
    text_characters = "".join(map(chr, range(32, 127)) + list("\n\r\t\b"))
    _null_trans = string.maketrans("", "")
    if not s:
        # Empty files are considered text
        return True
    if "\0" in s:
        # Files with null bytes are likely binary
        return False
    # Get the non-text characters (maps a character to itself then
    # use the 'remove' option to get rid of the text characters.)
    t = s.translate(_null_trans, text_characters)
    # If more than 30% non-text characters, then
    # this is considered a binary file
    if float(len(t))/float(len(s)) > 0.30:
        return False
    return True

Ответ 2

Это по своей сути не просто. Нет никакого способа узнать наверняка, хотя в большинстве случаев вы можете сделать разумное догадки.

Что вы могли бы сделать:

  • Ищите известные магические числа в бинарных подписях
  • Ищите знак байта Unicode в начале файла
  • Если файл регулярно 00 xx 00 xx 00 xx (для произвольного xx) или наоборот, возможно, UTF-16
  • В противном случае найдите 0s в файле; файл с 0 в вряд ли будет однобайтным текстовым файлом.

Но все это эвристика - вполне возможно иметь файл, который является допустимым текстовым файлом и действительным файлом изображения, например. Это, вероятно, было бы нонсенсом как текстовый файл, но законным в некотором кодировании или другом...

Ответ 3

Если ваш script работает на * nix, вы можете использовать что-то вроде этого:

import subprocess
import re

def is_text(fn):
    msg = subprocess.Popen(["file", fn], stdout=subprocess.PIPE).communicate()[0]
    return re.search('text', msg) != None

Ответ 4

Возможно, можно использовать libmagic, чтобы угадать тип MIME файла с помощью python-magic. Если вы вернетесь в пространство имен "text/*" , это, скорее всего, текстовый файл, в то время как все остальное, скорее всего, будет двоичный файл.