J'ai un dossier plein de fichiers et ils n'ont pas d'extension. Comment puis-je vérifier les types de fichiers? Je veux vérifier le type de fichier et changer le nom de fichier en conséquence. Supposons qu'une fonction filetype(x)
renvoie un type de fichier comme png
. Je veux faire ça:
files = os.listdir(".")
for f in files:
os.rename(f, f+filetype(f))
Comment puis-je faire cela?
python
filesystems
identification
emnoor
la source
la source
file types
. Voulez-vous dire déterminer s'il s'agit d'un gif, png, bmp ou jpg? Voulez-vous juste savoir s'il s'agit de texte / binaire? Exécutable?Réponses:
Il existe des bibliothèques Python qui peuvent reconnaître les fichiers en fonction de leur contenu (généralement un en-tête / numéro magique) et qui ne dépendent pas du nom ou de l'extension du fichier.
Si vous vous adressez à de nombreux types de fichiers différents, vous pouvez utiliser
python-magic
. C'est juste une liaison Python pour lamagic
bibliothèque bien établie . Cela a une bonne réputation et (petite approbation) dans l'usage limité que j'en ai fait, il a été solide.Il existe également des bibliothèques pour des types de fichiers plus spécialisés. Par exemple, la bibliothèque standard Python a le
imghdr
module qui fait la même chose uniquement pour les types de fichiers image.Si vous avez besoin d'une vérification du type de fichier sans dépendance (pur Python), voir
filetype
.la source
python-magic-win64
fonctionné pour moi dans WindowsLa bibliothèque Python Magic fournit les fonctionnalités dont vous avez besoin.
Vous pouvez installer la bibliothèque avec
pip install python-magic
et l'utiliser comme suit:>>> 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'
Le code Python dans ce cas appelle à libmagic sous le capot, qui est la même bibliothèque utilisée par la
file
commande * NIX . Ainsi, cela fait la même chose que les réponses basées sur le sous-processus / shell, mais sans cette surcharge.la source
import magic
mais ont un contenu incompatible. Voir stackoverflow.com/a/16203777/3189 pour en savoir plus.python-magic
bibliothèque plus efficace que l'utilisation d'approches de sous-processus?Sous Unix et Linux, il existe une
file
commande pour deviner les types de fichiers. Il y a même un port Windows .Depuis la page de manuel :
Vous devrez exécuter la
file
commande avec lesubprocess
module, puis analyser les résultats pour trouver une extension.edit: Ignorez ma réponse. Utilisez plutôt la réponse de Chris Johnson .
la source
file
que j'avais fait autant.# file arc.gif arc.gif: GIF image data, version 89a, 234 x 269
file
commande est qu'elle est native sur (la plupart?) Des distributions Linux alors que ne l'python-magic
est pas et doit être téléchargée et installée avant de pouvoir être utilisée. C'est un peu un problème si le script utilisant le module est censé être portable.Dans le cas des images, vous pouvez utiliser le
imghdr
module.>>> 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
la source
Vous pouvez également installer la
file
liaison officielle pour Python, une bibliothèque appeléefile-magic
(elle n'utilise pas de ctypes, commepython-magic
).Il est disponible sur PyPI en tant que file-magic et sur Debian en tant que python-magic . Pour moi, cette bibliothèque est la meilleure à utiliser car elle est disponible sur PyPI et sur Debian (et probablement d'autres distributions), ce qui facilite le processus de déploiement de votre logiciel. J'ai également blogué sur la façon de l'utiliser .
la source
import subprocess p = sub.Popen('file yourfile.txt', stdout=sub.PIPE, stderr=sub.PIPE) output, errors = p.communicate() print(output)
Comme Steven l'a souligné,
subprocess
c'est le chemin. Vous pouvez obtenir la sortie de commande de la manière ci - dessus ce poste ditla source
Avec la nouvelle bibliothèque de sous-processus, vous pouvez désormais utiliser le code suivant (solution * nix uniquement):
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
la source
shlex.split
, pourquoi ne pas simplement courirsubprocess.check_output(['file', '--mime-type', filename])
?vous pouvez également utiliser ce code (python pur par 3 octets de fichier d'en-tête):
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"
la source
Fonctionne uniquement pour Linux mais en utilisant le module python "sh", vous pouvez simplement appeler n'importe quelle commande shell
https://pypi.org/project/sh/
pip installer sh
Sortie: / root / file: texte ASCII
la source