Pergunta

Esta pergunta já tem uma resposta aqui:

Eu preciso identificar qual Arquivo é binário e que é um texto em um diretório.

Eu tentei usar Mimetipos Mas não é uma boa ideia no meu caso, porque não pode identificar todos os arquivos mimes, e eu tenho estranhos aqui ... eu só preciso saber, binário ou texto. Simples? Mas eu não conseguia encontrar uma solução ...

Obrigado

Foi útil?

Solução

Obrigado a todos, encontrei uma solução que se adequava ao meu problema. Eu encontrei este código em http://code.activestate.com/recipes/173220/ E eu mudei apenas um pedacinho para mim.

Funciona bem.

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

Outras dicas

É inerentemente não simples. Não há como saber com certeza, embora você possa dar um palpite razoavelmente bom na maioria dos casos.

Coisas que você gostaria de fazer:

  • Procure números mágicos conhecidos em assinaturas binárias
  • Procure a marcação de ordem de byte unicode no início do arquivo
  • Se o arquivo for regularmente 00 xx 00 xx 00 xx (para arbitrário xx) ou vice-versa, isso é possivelmente UTF-16
  • Caso contrário, procure 0s no arquivo; Um arquivo com 0 in é improvável para ser um arquivo de texto de codificação de byte.

Mas é tudo heurístico - é bem possível ter um arquivo que é um arquivo de texto válido e um arquivo de imagem válido, por exemplo. Provavelmente seria absurdo como um arquivo de texto, mas legítimo em uma codificação ou outra ...

Pode ser possível usar libmagic para adivinhar o tipo mímico do arquivo usando Python-Magic. Se você voltar algo no "texto/*" namespace, é provável que seja um arquivo de texto, enquanto qualquer outra coisa é provavelmente um arquivo binário.

Se o seu script estiver em execução no *nix, você poderá usar algo assim:

import subprocess
import re

def is_text(fn):
    msg = subprocess.Popen(["file", fn], stdout=subprocess.PIPE).communicate()[0]
    return re.search('text', msg) != None
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top