Pregunta

    

Esta pregunta ya tiene una respuesta aquí:

         

Necesito identificar qué archivo es binario y cuál es un texto en un directorio.

Intenté usar mimetypes pero no es una buena idea en mi caso porque no puede identificar todos los archivos mimes, y tengo extraños aquí ... Solo necesito saber, binario o texto. Sencillo ? Pero no pude encontrar una solución ...

Gracias

¿Fue útil?

Solución

Gracias a todos, encontré una solución que se adaptaba a mi problema. Encontré este código en http://code.activestate.com/recipes/173220/ y cambié solo una pequeña pieza para adaptarme.

Funciona bien.

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

Otros consejos

Es inherentemente no simple. No hay forma de saberlo con certeza, aunque puede hacer una suposición razonablemente buena en la mayoría de los casos.

Cosas que te gustaría hacer:

  • Busque números mágicos conocidos en firmas binarias
  • Busque la marca de orden de bytes Unicode al comienzo del archivo
  • Si el archivo es regularmente 00 xx 00 xx 00 xx (para arbitrario xx) o viceversa, es muy probable que sea UTF-16
  • De lo contrario, busque 0s en el archivo; es poco probable que un archivo con un 0 sea un archivo de texto de codificación de un solo byte.

Pero todo es heurístico: es bastante posible tener un archivo que sea un archivo de texto válido y un archivo de imagen válido, por ejemplo. Probablemente no tendría sentido como archivo de texto, pero es legítimo en alguna codificación u otra ...

Es posible usar libmagic para adivinar el tipo MIME del archivo usando python-magic . Si recupera algo en el " text / * " espacio de nombres, es probable que sea un archivo de texto, mientras que cualquier otra cosa es probable que sea un archivo binario .

Si su script se ejecuta en * nix, puede usar algo como esto:

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top