Python - mécanisme pour identifier le type de fichier compressé et décompresser
Un fichier compressé peuvent être classés en-dessous de groupes logiques
un. Le système d'exploitation qui vous travaillez (*ix, Win) etc.
b. Les différents types d'algorithme de compression (j'.e .zip,.Z,.bz2,.rar,.gzip). Au moins à partir d'une liste standard de principalement utilisé dans les fichiers compressés.
c. Ensuite, nous avons tar mécanisme où je suppose qu'il n'y a pas de compression. Mais il agit plus comme une concaténation.
Maintenant, si nous commençons à aborder la ci-dessus un ensemble de fichiers compressés
un. Option (a) serait pris en charge par python, car il est indépendant de la plateforme de la langue.
b. Option (b) et (c) semble avoir un problème.
De quoi ai-je besoin
Comment puis-je identifier le type de fichier (type de compression) et de l'ONU-les compresser?
Comme:
fileType = getFileType(fileName)
switch(fileType):
case .rar: unrar....
case .zip: unzip....
etc
Donc la question fondamentale est de savoir comment identifier l'algorithme de compression basé sur le fichier (en supposant que l'extension n'est pas fourni ou incorrecte)? Est-il une manière spécifique de le faire en python?
Vous devez vous connecter pour publier un commentaire.
Cette page a une liste de "magie" des fichiers de signatures. Prenez ceux que vous avez besoin et de les mettre dans un dict comme ci-dessous. Ensuite, nous avons besoin d'une fonction qui correspond à la dict touches avec le début du fichier. J'ai écrit une suggestion, si elle peut être optimisée par le prétraitement de la
magic_dict
par ex. un géant compilé regexp.Cette solution devrait être de la croix-plattform et est bien sûr pas dépendants de l'extension de nom de fichier, mais il peut donner des faux positifs pour les fichiers à contenu aléatoire qui vient de se produire pour commencer avec certains de la magie octets.
Basé sur lazyr la réponse de mon commentaire, voici ce que je veux dire:
Pouvez maintenant accéder aux données compressées à l'aide de
cf.accessor
. Tous les modules fournissent des méthodes similaires comme " read()', 'write (), etc. pour ce faire.C'est une question complexe qui dépend d'un certain nombre de facteurs: le plus important étant de savoir comment portable votre solution doit être.
Les principes de base derrière trouver le type de fichier donné un fichier est de trouver une identification d'en-tête dans le fichier, généralement quelque chose qui s'appelle un "la magie de la séquence ou de la signature de l'en-tête, qui indique qu'un fichier est d'un certain type. Son nom ou son extension est généralement pas utilisée si elle peut être évitée. Pour certains fichiers, Python a construit dans cette. Par exemple, pour faire face à
.tar
fichiers, vous pouvez utiliser letarfile
module, qui a une pratiqueis_tarfile
méthode. Il y a un module semblable nommézipfile
. Ces modules vous permettra aussi d'extraire les fichiers dans le plus pur Python.Par exemple:
Si votre solution est Linux ou OSX, seulement, il y a aussi le
file
de commande qui va faire beaucoup de travail pour vous. Vous pouvez également utiliser les outils intégrés pour décompresser les fichiers. Si vous êtes juste de faire un script simple, cette méthode est plus simple et vous donnera de meilleures performances."a" est complètement fausse.
"b" peut être facilement interprété mal ".zip" ne signifie pas que le fichier est un fichier zip. Il pourrait être un JPEG avec zip d'extension (dans la confusion entre les fins, si vous voulez).
Vous avez vraiment besoin de vérifier si les données du fichier ne correspond aux données qui devrait avoir par son extension.
Aussi jeter un oeil à la magie de l'octet.
Si l'exercice est d'identifier que c'est juste pour les fichiers d'étiquettes, vous avez beaucoup de réponses. Si vous souhaitez décompresser l'archive, pourquoi ne pas simplement essayer et attraper les execptions/des erreurs? Par exemple: