python détecter si il s'agit d'un fichier tar, tar.gz ou zip ?

a marqué ce sujet comme résolu.

Bonjour, je bute sur un probleme, je cherche à déterminer la nature d’un fichier en python (tar, tar.gz ou zip) j’ai trouvé une solution :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
magic_dict = {
    "\x1f\x8b\x08": "gz",
    "\x00\x00\x00": "tar",
    "\x50\x4b\x03\x04": "zip"
    }

max_len = max(len(x) for x in magic_dict)

def file_type(filename):
    with open(filename) as f:
        file_start = f.read(max_len)
    for magic, filetype in magic_dict.items():
        if file_start.startswith(magic):
            return filetype
    return "no match"

seulement, cette solution ne marche pas pour les fichiers tar, en effet un tar commence pas par les memes bytes, du coup comment faire pour les tar, ou bien avez vous une autre solution ?

+0 -0

Bonjour,

Le problème est que tu considères que la signature du fichier (magic number) se situe forcément au tout début. Ce n’est pas le cas des archives tar, où la signature est à l’offset 0x101.

https://en.wikipedia.org/wiki/List_of_file_signatures

Il doit exister des bibliothèques pour cela.

Peut-être utiliser le module qui va bien, genre mimetypes ?

bendia

Non, mimetypes ne sert pas à cela, et ne regarde pas le contenu du fichier (ça se base uniquement sur l’extension).

Si tu sais, tu peux utiliser la libmagic (qui marche vraiment bien et qui s’installe facilemennt).

Par contre, mimetypes une librairie standard, mais ce base à priori sur l’extension de fichier (ce qui n’est pas garanti, même si c’est mieux que rien).

EDIT: grillé par entwanne pour mimetypes

+0 -0

Ou alors on utilise la lib standard et les modules zipfile, gzip et tarfile :

Un truc dans le genre :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import zipfile
import gzip
import tarfile

ctors = {"zip": zipfile.ZipFile, "gz": gzip.GzipFile, "tar": tarfile.open}

def type_archive(fname):
    for kind, ctr in ctors.items():
        try:
            ctr(fname, "r")
            return kind
        except:
            pass
    return "unknown"

L’idée est d’utiliser les fonctions qui permettent d’ouvrir ces types de fichiers et de renvoyer le premier qui fonctionne.

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte