8 votes

Python tarfile et exclut

Ceci est un extrait de la documentation de Python:

Si exclude est donné, il doit s'agir d'une fonction prenant un argument de nom de fichier et renvoyant une valeur booléenne. En fonction de cette valeur, le fichier respectif est soit exclu (True) soit ajouté (False).

Je dois admettre que je n'ai aucune idée de ce que cela signifie.

En outre:

Obsolète depuis la version 2.7: Le paramètre exclude est obsolète, veuillez utiliser à la place le paramètre filter. Pour une portabilité maximale, filter doit être utilisé en tant qu'argument de mot-clé plutôt qu'en tant qu'argument positionnel afin que le code ne soit pas affecté lorsque exclude est finalement supprimé.

D'accord... et la définition de "filter":

Si filter est spécifié, il doit s'agir d'une fonction prenant un argument d'objet TarInfo et renvoyant l'objet TarInfo modifié. S'il renvoie plutôt None, l'objet TarInfo sera exclu de l'archive.

... retour à la case départ :)

ce dont j'ai vraiment besoin est un moyen de passer un tableau (ou une chaîne de caractères délimitée par ":") d'exclusions à tarfile.add.

Je ne verrais aucun inconvénient à ce que vous essayiez d'expliquer ce que signifient ces passages de PyDocs.

P.S.:

Cela m'a traversé l'esprit:

  • Créer un tableau d'une liste du contenu du répertoire source
  • Retirer les exclusions
  • Faire un tar.add sur les membres individuels du tableau qui restent

Mais, j'aimerais que cela soit fait de manière plus cultivée

24voto

Aya Points 13144

Si l'exclusion est donnée, elle doit être une fonction qui prend un argument de nom de fichier et renvoie une valeur booléenne. En fonction de cette valeur, le fichier respectif est soit exclu (True) soit ajouté (False).

Par exemple, si vous vouliez exclure tous les noms de fichiers commençant par la lettre 'a', vous feriez quelque chose comme cela...

def fonction_exclure(nom_fichier):
    if nom_fichier.startswith('a'):
        return True
    else:
        return False

mytarfile.add(..., exclude=fonction_exclure)

Pour votre cas, vous voudriez quelque chose comme...

EXCLURE_FICHIERS = ['README', 'INSTALL', '.cvsignore']

def fonction_exclure(nom_fichier):
    if nom_fichier in EXCLURE_FICHIERS:
        return True
    else:
        return False

mytarfile.add(..., exclude=fonction_exclure)

... ce qui peut être réduit à...

EXCLURE_FICHIERS = ['README', 'INSTALL', '.cvsignore']

mytarfile.add(..., exclude=lambda x: x in EXCLURE_FICHIERS)

Mise à jour

Franchement, je ne m'inquiéterais pas trop du avertissement de dépréciation, mais si vous voulez utiliser le nouveau paramètre filter, vous auriez besoin de quelque chose comme...

EXCLURE_FICHIERS = ['README', 'INSTALL', '.cvsignore']

def fonction_filtrer(tarinfo):
    if tarinfo.name in EXCLURE_FICHIERS:
        return None
    else:
        return tarinfo

mytarfile.add(..., filter=fonction_filtrer)

... ce qui peut être réduit à...

EXCLURE_FICHIERS = ['README', 'INSTALL', '.cvsignore']

mytarfile.add(..., filter=lambda x: None if x.name in EXCLURE_FICHIERS else x)

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