102 votes

Comment vérifier le type de fichiers sans extension ?

J'ai un dossier rempli 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 modifier le nom du fichier en conséquence. Supposons 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 dois-je m'y prendre ?

109voto

Chris Johnson Points 2887

Il existe des bibliothèques Python qui peuvent reconnaître les fichiers sur la base de leur contenu (généralement un en-tête / numéro magique) et qui ne se basent pas sur le nom ou l'extension du fichier.

Si vous vous adressez à plusieurs types de fichiers différents, vous pouvez utiliser python-magic . C'est juste une liaison Python pour le bien établi magic bibliothèque. Il a une bonne réputation et (petite approbation) dans l'utilisation limitée que j'en ai faite, 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 possède la bibliothèque imghdr qui fait la même chose, mais pour les types de fichiers image.

Si vous avez besoin d'une vérification du type de fichier sans dépendance (purement Python), voir filetype .

72voto

Richard Points 5991

En Python Magic fournit la fonctionnalité 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'

Dans ce cas, le code Python fait appel à libmagic sous le capot, qui est la même bibliothèque que celle utilisée par le système *NIX file commande. Ainsi, cela fait la même chose que les réponses basées sur un sous-processus ou un shell, mais sans cette surcharge.

10voto

Steven Rumbalski Points 16838

Sur unix et linux, il y a le file pour deviner les types de fichiers. Il y a même un Portail Windows .

De la page de manuel :

File teste chaque argument pour tenter de le classer. Il existe trois ensembles de tests, effectués dans cet ordre : tests du système de fichiers, tests du nombre et tests de langue. Le premier test qui réussit provoque l'affichage du le type de fichier est imprimé.

Vous devez exécuter le programme file avec la commande subprocess puis d'analyser les résultats pour trouver une extension.

éditer : Ignorez ma réponse. Utilisez la réponse de Chris Johnson réponse à la place.

9voto

Lewis Diamond Points 551

Dans le cas des images, vous pouvez utiliser la fonction 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

6voto

xvatar Points 1740
import subprocess as sub
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 commande de la manière ci-dessus comme ceci poste a déclaré

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X