web-dev-qa-db-fra.com

Comment vérifier le type de fichiers sans extensions en python?

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?

65
emnoor

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.

70
Chris Johnson

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.

54
Richard

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.

10
Steven Rumbalski
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

7
xvatar

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.

6
Álvaro Justen

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'

Python 2 imghdr doc
Python 3 imghdr doc

4
Lewis Diamond

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
4
berniey

Ne fonctionne que pour Linux mais en utilisant le module "sh" python, vous pouvez simplement appeler n’importe quelle commande Shell

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

pip installer sh

importation sh

sh.file ("/ root/file")

Sortie:/root/file: ASCII text

1
Lelouch Lamprouge

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]

0
evergreen