J'ai un dossier plein de fichiers et ceux-ci 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 du fichier en conséquence. Supposons qu'une fonction filetype(x)
renvoie un type de fichier tel que png
. Je veux faire ça:
files = os.listdir(".")
for f in files:
os.rename(f, f+filetype(f))
Comment puis-je faire cela?
Il existe des bibliothèques Python) capables de reconnaître les fichiers en fonction de leur contenu (généralement un en-tête/un nombre magique) et qui ne dépendent pas du nom ou de l'extension du fichier.
Si vous vous adressez à différents types de fichiers, vous pouvez utiliser python-magic
. C’est juste une liaison Python pour la bibliothèque bien établie magic
. Elle jouit d’une bonne réputation et (petit appui) dans l’usage limité que j’en ai fait, elle 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 module imghdr
qui fait la même chose pour les types de fichiers image.
La bibliothèque Python Magic fournit les fonctionnalités dont vous avez besoin.
Vous pouvez installer la bibliothèque avec pip install python-magic
et utilisez-le 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 que celle utilisée par la commande * NIX file
. Ainsi, cela fait la même chose que les réponses basées sur le sous-processus/Shell, mais sans cette surcharge.
Sous Unix et Linux, la commande file
permet de deviner les types de fichiers. Il y a même un port Windows .
De la page de manuel :
File teste chaque argument pour tenter de le classer. Il existe trois ensembles de tests, exécutés dans cet ordre: les tests de système de fichiers, les tests de nombres magiques et les tests de langue. Le premier test qui réussit entraîne l'impression du type de fichier.
Vous devez exécuter la commande file
avec le module subprocess
, puis analyser les résultats pour déterminer une extension.
modifier: Ignorer ma réponse. Utilisez plutôt answer de Chris Johnson.
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
est le chemin. Vous pouvez obtenir la sortie de la commande par le chemin ci-dessus car post dit
Vous pouvez également installer la liaison officielle file
de Python, une bibliothèque appelée file-magic
_ (il n’utilise pas de types de caractères, comme python-magic
).
Il est disponible sur PyPI sous la forme file-magic et sur Debian sous la forme 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 blogué sur la façon de l'utiliser , aussi.
Dans le cas des images, vous pouvez utiliser le module imghdr.
>>> 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'
Avec la nouvelle bibliothèque de sous-processus, vous pouvez maintenant utiliser le code suivant (* 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
Ne fonctionne que pour Linux mais en utilisant le module "sh" python, vous pouvez simplement appeler n’importe quelle commande Shell
pip installer sh
importation sh
sh.file ("/ root/file")
Sortie:/root/file: ASCII text
vous pouvez aussi utiliser ce code (pure python 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"
sans aucun paquet installer [et mettre à jour la version]