Wie kann ich feststellen, ob eine Datei binär ist (non-text) in python?

Wie kann ich feststellen, ob eine Datei binär (non-text) in python ist? Ich suche durch eine große Menge von Dateien in Python, und halten immer Spiele in Binärdateien. Das macht die Ausgabe unglaublich unordentlich.

Ich weiß, ich könnte grep -I, aber ich mache mehr mit den Daten, als was grep erlaubt.

In der Vergangenheit hätte ich nur nach Charakteren gesucht, die größer als 0x7f sind, aber utf8 und dergleichen machen das auf modernen Systemen unmöglich. Idealerweise wäre die Lösung schnell, aber jede Lösung wird es tun.

11 Solutions collect form web for “Wie kann ich feststellen, ob eine Datei binär ist (non-text) in python?”

Sie können auch das Modul mimetypes verwenden:

 import mimetypes ... mime = mimetypes.guess_type(file) 

Es ist ziemlich einfach, eine Liste von binären Mime-Typen zu kompilieren. Zum Beispiel verteilt Apache mit einer mime.types-Datei, die man in einen Satz von Listen, Binär und Text analysieren könnte und dann überprüfen, ob der Mime in deiner Text- oder Binärliste ist.

Noch eine andere Methode basierend auf Datei (1) Verhalten :

 >>> textchars = bytearray({7,8,9,10,12,13,27} | set(range(0x20, 0x100)) - {0x7f}) >>> is_binary_string = lambda bytes: bool(bytes.translate(None, textchars)) 

Beispiel:

 >>> is_binary_string(open('/usr/bin/python', 'rb').read(1024)) True >>> is_binary_string(open('/usr/bin/dh_python3', 'rb').read(1024)) False 

Versuche dies:

 def is_binary(filename): """Return true if the given filename is binary. @raise EnvironmentError: if the file does not exist or cannot be accessed. @attention: found @ http://bytes.com/topic/python/answers/21222-determine-file-type-binary-text on 6/08/2010 @author: Trent Mick <TrentM@ActiveState.com> @author: Jorge Orpinel <jorge@orpinel.com>""" fin = open(filename, 'rb') try: CHUNKSIZE = 1024 while 1: chunk = fin.read(CHUNKSIZE) if '\0' in chunk: # found null byte return True if len(chunk) < CHUNKSIZE: break # done # A-wooo! Mira, python no necesita el "except:". Achis... Que listo es. finally: fin.close() return False 

Wenn es hilft, beginnen viele viele Binärarten mit einer magischen Zahl. Hier ist eine Liste der Signaturen.

Hier ist ein Vorschlag, der den Unix- Datei- Befehl verwendet:

 import re import subprocess def istext(path): return (re.search(r':.* text', subprocess.Popen(["file", '-L', path], stdout=subprocess.PIPE).stdout.read()) is not None) 

Beispiel:

 >>> istext ('/ etc / motd') 
 Wahr
 >>> istext ('/ vmlinuz') 
 Falsch
 >>> offen ('/ tmp / japanese') read ()
 '\ Xe3 \ xe3 \ x81 \ xe3 \ x81 \ x8 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Xe5 \ xb1 \ xa \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ X80 \ x82 \ n '
 >>> istext ('/ tmp / japanese') # funktioniert auf UTF-8
 Wahr

Es hat die Nachteile von nicht tragbar zu Windows (es sei denn, Sie haben so etwas wie die file Befehl dort), und mit einem externen Prozess für jede Datei, die möglicherweise nicht schmackhaft.

Binärkupfer Bibliothek ( GitHub ) verwenden.

Es ist sehr einfach und basiert auf dem Code, der in dieser stackoverflow Frage gefunden wird.

Sie können dies in 2 Zeilen Code schreiben, aber dieses Paket spart Ihnen von zu schreiben und gründlich testen diese 2 Zeilen Code mit allen Arten von seltsamen Dateitypen, Cross-Plattform.

Normalerweise muss man erraten.

Du kannst die Erweiterungen als einen Hinweis ansehen, wenn die Dateien sie haben.

Sie können auch wissen, binäre Formate zu erkennen, und ignorieren diese.

Ansonsten sehen Sie, welchen Anteil der nicht druckbaren ASCII-Bytes Sie haben und nehmen Sie eine Vermutung davon.

Sie können auch versuchen, Decodierung von UTF-8 und sehen, ob das erzeugt sinnvolle Ausgabe.

Wenn du nicht unter Windows bist, kannst du Python Magic benutzen, um den Dateityp zu bestimmen. Dann können Sie überprüfen, ob es sich um einen Text / Mime-Typ handelt.

Kürzere Lösung, mit UTF-16 Warnung:

 def is_binary(filename): """ Return true if the given filename appears to be binary. File is considered to be binary if it contains a NULL byte. FIXME: This approach incorrectly reports UTF-16 as binary. """ with open(filename, 'rb') as f: for block in f: if '\0' in block: return True return False 

Bist du in unix Wenn ja, dann versuchen:

 isBinary = os.system("file -b" + name + " | grep text > /dev/null") 

Die Shell-Return-Werte sind invertiert (0 ist ok, also wenn es "Text" findet, dann wird es eine 0 zurückgeben und in Python das ist ein falscher Ausdruck).

Ich bin hier auf der Suche nach genau das Gleiche – eine umfassende Lösung, die von der Standardbibliothek zur Verfügung gestellt wird, um Binär oder Text zu erkennen. Nach der Überprüfung der Optionen, die Leute vorgeschlagen, die nix Datei Befehl sieht die beste Wahl (ich bin nur für Linux-Boxen). Einige andere haben Lösungen mit Datei veröffentlicht, aber sie sind unnötig kompliziert in meiner Meinung, also hier ist, was ich kam mit:

 def test_file_isbinary(filename): cmd = shlex.split("file -b -e soft '{}'".format(filename)) if subprocess.check_output(cmd)[:4] in {'ASCI', 'UTF-'}: return False return True 

Es sollte selbstverständlich sein, aber Ihr Code, der diese Funktion aufruft, sollte sicherstellen, dass Sie eine Datei lesen können, bevor Sie sie testen, sonst wird dies fälschlicherweise die Datei als Binär erkennen.

  • Weg, um Python-Dateien in einem separaten Ordner kompiliert haben?
  • Lesen und überschreiben Sie eine Datei in Python
  • Datei Manipulation: Scripting Frage
  • Python: Lesen Sie alle Textdatei Zeilen in Schleife
  • Django-Datei-Upload: Dateiname nicht kleben
  • Lesen von Ganzzahlen aus Binärdatei in Python
  • Was ist der pythonischste Weg, um über alle Zeilen von mehreren Dateien zu iterieren?
  • Python PyCrypto verschlüsselt / entschlüsselt Textdateien mit AES
  • Django - Erstellen Sie einen Zip von mehreren Dateien und machen es herunterladbar [duplizieren]
  • Python importieren & mit cdll (mit einem linux .so Datei)
  • Verwenden von Doppelpunkten in ConfigParser Python
  • Python ist die beste Programmiersprache der Welt.