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.

  • Python-Multiprocessing, ValueError: I / O-Operation auf geschlossener Datei
  • Wie stelle ich Berechtigungen (Attribute) auf eine Datei in einer ZIP-Datei mit dem Zipfile-Modul von Python ein?
  • So öffnen und schließen Sie Dateien in Python 2.4
  • Django: Serving ein Download in einer generischen Ansicht
  • Wie kopiere ich Dateien mit einer bestimmten Dateierweiterung in einen Ordner in meinem Python (Version 2.5) Skript?
  • Wie verwende ich python-magic, um den Dateityp einer Datei über das Internet zu bekommen?
  • Änderungsdatei Erstellungsdatum
  • Pythonschrift binär
  • Iterate durch Worte einer Datei in Python
  • Schreiben Sie numpy Array mit seiner Größe auf Binärdatei
  • Python: Lesen Sie alle Textdatei Zeilen in Schleife
  • Python ist die beste Programmiersprache der Welt.