¿Cómo identificar archivos binarios y de texto usando Python? [duplicar]
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
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