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

этот вопрос уже есть ответ здесь:

Мне нужно определить, какие и бинарные и текст в каталоге.

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

спасибо

4 ответов


спасибо всем, я нашел решение, которое соответствовало моей проблеме. Я нашел этот код в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 "" 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

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

вещей, которые вы могли бы сделать:

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

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


Если ваш скрипт работает на *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

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