it-swarm.com.de

Wie prüfe ich den Dateityp ohne Dateierweiterungen in Python?

Ich habe einen Ordner voller Dateien und diese haben keine Erweiterung. Wie kann ich Dateitypen überprüfen? Ich möchte den Dateityp überprüfen und den Dateinamen entsprechend ändern. Nehmen wir an, eine Funktion filetype(x) gibt einen Dateityp wie png zurück. Ich möchte das machen:

files = os.listdir(".")
for f in files:
    os.rename(f, f+filetype(f))

Wie mache ich das?

65
emnoor

Es gibt Python - Bibliotheken, die Dateien anhand ihres Inhalts erkennen können (normalerweise eine Kopf-/Zauberzahl) und die sich nicht auf den Dateinamen oder die Dateierweiterung stützen.

Wenn Sie viele verschiedene Dateitypen ansprechen, können Sie python-magic . Das ist nur eine Python Bindung für die gut etablierte magic Bibliothek. Diese hat einen guten Ruf und (kleine Unterstützung) in dem begrenzten Gebrauch, den ich davon gemacht habe war solide.

Es gibt auch Bibliotheken für speziellere Dateitypen. Zum Beispiel hat die Standardbibliothek Python=) das Modul imghdr , das dasselbe nur für Bilddateitypen ausführt.

70
Chris Johnson

Die Python Magic Bibliothek bietet die Funktionalität, die Sie benötigen.

Sie können die Bibliothek mit pip install python-magic Installieren und wie folgt verwenden:

>>> import magic

>>> magic.from_file('iceland.jpg')
'JPEG image data, JFIF standard 1.01'

>>> magic.from_file('iceland.jpg', mime=True)
'image/jpeg'

>>> magic.from_file('greenland.png')
'PNG image data, 600 x 1000, 8-bit colormap, non-interlaced'

>>> magic.from_file('greenland.png', mime=True)
'image/png'

Der Python Code ruft in diesem Fall libmagic unter der Haube auf. Dies ist dieselbe Bibliothek, die auch vom Befehl * NIX file verwendet wird. Dies entspricht dem Teilprozess/den Shell-basierten Antworten, jedoch ohne diesen Overhead.

54
Richard

Unter Unix und Linux gibt es den Befehl file , um Dateitypen zu erraten. Es gibt sogar einen Windows-Port .

Aus der Manpage :

File testet jedes Argument, um es zu klassifizieren. Es gibt drei Testreihen, die in dieser Reihenfolge durchgeführt werden: Dateisystemtests, Tests mit magischen Zahlen und Sprachtests. Der erste erfolgreiche Test bewirkt, dass der Dateityp gedruckt wird.

Sie müssten den Befehl file mit dem Modul subprocess ausführen und dann die Ergebnisse analysieren, um eine Erweiterung zu ermitteln.

edit: Ignoriere meine Antwort. Verwenden Sie stattdessen Chris Johnsons Antwort .

10
import subprocess
p = sub.Popen('file yourfile.txt',stdout=sub.PIPE,stderr=sub.PIPE)
output, errors = p.communicate()
print output

Wie Steven betonte, ist subprocess der Weg. Sie können den Befehl wie oben beschrieben ausgeben lassen post said

7
xvatar

Sie können auch die offizielle file Bindung für Python installieren, eine Bibliothek namens file-magic (verwendet keine ctypes, wie python-magic).

Es ist auf PyPI als file-magic und auf Debian als python-magic verfügbar. Für mich ist diese Bibliothek die beste, da sie auf PyPI und Debian (und wahrscheinlich auch auf anderen Distributionen) verfügbar ist, was die Bereitstellung Ihrer Software erleichtert. Ich habe gebloggt, wie man es benutzt , auch.

6
Álvaro Justen

Im Falle von Bildern können Sie das imghdr-Modul verwenden.

>>> import imghdr
>>> imghdr.what('8e5d7e9d873e2a9db0e31f9dfc11cf47')  # You can pass a file name or a file object as first param. See doc for optional 2nd param.
'png'

Python 2 imghdr doc
Python 3 imghdr doc

4
Lewis Diamond

Mit einer neueren Unterprozessbibliothek können Sie jetzt den folgenden Code verwenden (* nix only solution):

import subprocess
import shlex

filename = 'your_file'
cmd = shlex.split('file --mime-type {0}'.format(filename))
result = subprocess.check_output(cmd)
mime_type = result.split()[-1]
print mime_type
4
berniey

Funktioniert nur unter Linux, aber mit dem Modul "sh" python=) können Sie einfach einen beliebigen Shell-Befehl aufrufen

https://pypi.org/project/sh/

pip install sh

importieren sh

sh.file ("/ root/file")

Ausgabe:/root/file: ASCII text

1

sie können auch diesen Code verwenden (rein python durch 3 Byte Header-Datei):

full_path = os.path.join(MEDIA_ROOT, pathfile)

try:
    image_data = open(full_path, "rb").read()
except IOError:
    return "Incorrect Request :( !!!"

header_byte = image_data[0:3].encode("hex").lower()

if header_byte == '474946':
    return "image/gif"
Elif header_byte == '89504e':
    return "image/png"
Elif header_byte == 'ffd8ff':
    return "image/jpeg"
else:
    return "binary file"

ohne Paket installieren [und Version aktualisieren]

0
evergreen