Domanda

    

Questa domanda ha già una risposta qui:

         

Devo identificare quale file è binario e quale è un testo in una directory.

Ho provato a usare mimetypes ma non è una buona idea nel mio caso perché non è in grado di identificare tutti i file mimi, e qui ho degli estranei ... Ho solo bisogno di sapere, binario o di testo. Semplice? Ma non sono riuscito a trovare una soluzione ...

Grazie

È stato utile?

Soluzione

Grazie a tutti, ho trovato una soluzione adatta al mio problema. Ho trovato questo codice su http://code.activestate.com/recipes/173220/ e ho cambiato solo un piccolo pezzo per adattarmi a me.

Funziona bene.

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

Altri suggerimenti

È intrinsecamente non semplice. Non c'è modo di saperlo con certezza, anche se nella maggior parte dei casi si può fare una supposizione abbastanza buona.

Cose che potresti fare:

  • Cerca i numeri magici noti nelle firme binarie
  • Cerca il byte-order-mark Unicode all'inizio del file
  • Se il file è regolarmente 00 xx 00 xx 00 xx (per xx arbitrario) o viceversa, è probabilmente UTF-16
  • Altrimenti, cerca 0 nel file; un file con 0 in è improbabile come file di testo con codifica a byte singolo.

Ma è tutto euristico - è del tutto possibile avere un file che è un file di testo valido e un file di immagine valido, per esempio. Probabilmente sarebbe una sciocchezza come file di testo, ma legittima in qualche codifica o altro ...

Potrebbe essere possibile utilizzare libmagic per indovinare il tipo MIME del file utilizzando python-magic . Se torni qualcosa nello " text / * " , è probabilmente un file di testo, mentre qualsiasi altra cosa è probabilmente un file binario .

Se il tuo script è in esecuzione su * nix, potresti usare qualcosa del genere:

import subprocess
import re

def is_text(fn):
    msg = subprocess.Popen(["file", fn], stdout=subprocess.PIPE).communicate()[0]
    return re.search('text', msg) != None
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top