Ich habe einen Ordner voller Dateien und sie 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 zurück png
. Ich möchte das machen:
files = os.listdir(".")
for f in files:
os.rename(f, f+filetype(f))
Wie mache ich das?
python
filesystems
identification
emnoor
quelle
quelle
file types
. Meinen Sie damit, festzustellen, ob es sich um ein GIF, PNG, BMP oder JPG handelt? Möchten Sie nur wissen, ob es sich um Text / Binär handelt? Ausführbar?Antworten:
Es gibt Python-Bibliotheken, die Dateien anhand ihres Inhalts erkennen können (normalerweise eine Kopfzeile / magische Zahl) und sich nicht auf den Dateinamen oder die Dateierweiterung verlassen.
Wenn Sie viele verschiedene Dateitypen ansprechen, können Sie verwenden
python-magic
. Das ist nur eine Python-Bindung für die etabliertenmagic
Bibliothek. Dies hat einen guten Ruf und (kleine Bestätigung) in der begrenzten Verwendung, die ich davon gemacht habe, war es solide.Es gibt auch Bibliotheken für speziellere Dateitypen. Zum Beispiel hat die Python-Standardbibliothek die
imghdr
Modul, das nur für Bilddateitypen dasselbe tut.Wenn Sie eine abhängigkeitsfreie (reine Python-) Dateitypprüfung benötigen, lesen Sie
filetype
.quelle
python-magic-win64
funktionierte für mich in WindowsDie Python Magic- Bibliothek bietet die Funktionen, die Sie benötigen.
Sie können die Bibliothek mit installieren
pip install python-magic
und wie folgt verwenden:Der Python-Code ruft in diesem Fall libmagic unter der Haube auf. Dies ist dieselbe Bibliothek, die auch vom
file
Befehl * NIX verwendet wird . Dies macht also dasselbe wie die auf Teilprozessen / Shell basierenden Antworten, jedoch ohne diesen Aufwand.quelle
import magic
aber inkompatible Inhalte. Weitere Informationen finden Sie unter stackoverflow.com/a/16203777/3189 .python-magic
Bibliothek effizienter als die Verwendung von Unterprozessansätzen?Unter Unix und Linux gibt es den
file
Befehl, Dateitypen zu erraten. Es gibt sogar einen Windows-Port .Von der Manpage :
Sie müssten den
file
Befehl mit demsubprocess
Modul ausführen und dann die Ergebnisse analysieren, um eine Erweiterung herauszufinden.edit: Ignoriere meine Antwort. Verwenden Sie stattdessen die Antwort von Chris Johnson .
quelle
file
dass ich so viel getan habe.# file arc.gif arc.gif: GIF image data, version 89a, 234 x 269
file
Befehls besteht darin, dass er auf (den meisten?) Linux-Distributionen nativ ist, während diespython-magic
nicht der Fall ist und heruntergeladen und installiert werden muss, bevor er verwendet werden kann. Dies ist ein Problem, wenn das Skript, das das Modul verwendet, portabel sein soll.Bei Bildern können Sie das
imghdr
Modul verwenden.Python 2 imghdr doc
Python 3 imghdr doc
quelle
Sie können auch die offizielle
file
Bindung für Python installieren , eine Bibliothek namensfile-magic
(sie verwendet keine ctypes, wiepython-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 auch darüber gebloggt, wie man es benutzt .
quelle
Wie Steven betonte,
subprocess
ist der Weg. Sie können die Befehlsausgabe durch die Art und Weise oben erhalten , wie diese Post sagtequelle
Mit einer neueren Unterprozessbibliothek können Sie jetzt den folgenden Code verwenden (nur * nix-Lösung):
quelle
shlex.split
Warum nicht einfach laufen, anstatt zu verwendensubprocess.check_output(['file', '--mime-type', filename])
?Sie können auch diesen Code verwenden (reines Python mit 3 Byte Header-Datei):
quelle
Funktioniert nur unter Linux, aber mit dem Python-Modul "sh" können Sie einfach einen beliebigen Shell-Befehl aufrufen
https://pypi.org/project/sh/
pip install sh
Ausgabe: / root / file: ASCII-Text
quelle