Annonce

Réduire
Aucune annonce.

Débutant - Archiver un dossier en base64

Réduire
X
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • Débutant - Archiver un dossier en base64

    Bonjour à tous !
    Je vous propose un nouveau challenge pour débutants ou passionnés.

    Contexte et objectif

    Vous êtes un développeur informatique d'une grande entreprise. Le patron souhaite une application en Python (version 2.7.* ou 3.*) pour compiler une arborescence (Chemin d'accès, contenu des fichiers). Vous placerez le résultat dans un fichier texte.

    Astuce

    Sachant qu'il existe des fichiers binaires, il est préférable de compresser tout les fichiers en base64. Et peut-être même les sous-répertoires de manière imbriquée.

    Exemple : (b64 = base64)

    Code:
    b64( // Répertoire 'Partage'
    
        b64( // Répertoire 'Notes'
            b64(fichier.txt)
        )
    
        b64( // Répertoire 'Document'
            b64(apps.exe)
            b64(img.jpg)
        )
    )
    Pour les notations et les délimiteurs, je vous laisse le soin de trouver ceux les plus appropriés.

    Je vous propose de lire une petite documentation. Ça servira de cours pour les débutant et de rappel pour les amateurs.

    Documentation

    Délimiteur : il s'agit d'un caractère peux utilisé qui permettra de délimiter différent champs. Exemple "1:2:3:4:5", le délimiteur ici est ":".

    Compiler : c'est une action informatique qui a pour objectif de rassembler une quantité d'information dans un seul ensemble non imbriqué.

    Il existe une seconde définition en programmation : action d'un compilateur pour transformer un code source en application exécutable. (C,C+,C++,C#,ASM en fichier binaire)

    Imbrication : ensemble de données qui s'articule autour d'une arborescence, rangé et ordonné.

    Encodage / décodage en base64

    Code:
    import base64
    
    y=base64.b64encode('hello')
    print base64.b64decode(y)
    Qu'est-ce que base64 ? (Lisez ces lignes attentivement)

    Base64 n'est pas un système de compression.
    Il permet de stocker des bits [0-255] sous un format lisible :
    ABCDEFGHIJKLMNOPQRTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
    Dans ce challenge, base64 permettra à la fois de stocker en mémoire des fichiers binaires et d'utiliser un délimiteur pour toutes les informations nécessaires : nom!type!contenu:nom!type!contenu:nom!type!contenu [...]

    Nom : Nom du fichier ou du dossier
    Type : Fichier ou Dossier (0/1)
    Contenu : La donnée du fichier ou du dossier en base64

    Entraînez vous d'abord à encoder en base64 pour comprendre le fonctionnement.

    Bonus !
    Code:
    #!/usr/bin/python
    import base64
    
    bin=open('123.jpg','rb').read()
    y=base64.b64encode(bin)
    file=open('out.jpg','wb')
    file.write(base64.b64decode(y))
    file.close()
    Lire un fichier en mode binaire

    Code:
    file=open('monfichier.exe','rb')
    Écrire dans un fichier texte

    Code:
    file=open('sortie.txt','w')
    file.write("J'ecris dans mon fichier")
    file.close()
    Vérifier l'existence d'un répertoire ou d'un fichier

    Code:
    import os
    
    if os.path.isfile('doc.txt'):
        print 'Le fichier existe !'
    
    if os.path.isdir('bin'):
        print 'Le dossier existe !'
    Lister les dossiers et fichiers

    Code:
    import os
    
    ls=os.listdir('bin')
    Fonction split

    La fonction split permet de créer des tableaux à partir d'une chaîne et d'un délimiteur.
    Exemple :

    Code:
    chaine="1:2:3:4:5"
    chaine=chaine.split(':')
    print chaine[2]
    # Affiche '3'
    Boucles

    Vous aurez probablement besoin des boucles
    Voici le même exemple avec la boucle While et For : l'algorithme lit ligne par ligne un fichier texte.

    Boucle while
    Code:
    file=open('fichier.txt','rb').read().split('\n')
    i=0
    while i < len(file):
        print file[i]
        i=i+1
    Boucle for
    Code:
    file=open('fichier.txt','rb').read().split('\n')
    for line in file:
        print line

    Je pense avoir fait le tour des commandes essentielles.
    N'oubliez pas de vous aider d'internet ! La réponse ne s'y trouve pas, ouf !

    Et si vous avez des questions, relisez une nouvelle fois le sujet avant de poster.
    Je ne veux pas d'étourdie. L'objectif est de créer un logiciel qui compile une arborescence de répertoires et de fichiers.

    Note : Les réponses peuvent être envoyés par MP. Avec le titre "Challenge".

    Pour faire plaisir à fred :
    Une indentation de 4 espaces est obligatoire, voir la PEP8 si vous ne comprenez pas pourquoi...
    Ne dépassez pas 80 caractères sur 1 ligne de code, idem voir PEP8

    Fred m'a indiqué un autre système algorithmique, n'hésitez pas à l'utiliser :

    [13h40] fred: @yarflam dans ton challenge pourquoi split() ?
    [13h42] Yarflam: Pour pouvoir rentrer plusieurs fichiers dans un seul ensemble de donnée
    [13h42] Yarflam: La partie Astuce explique bien le concept de l'algorithme
    [13h43] Yarflam: [fichier1]:[fichier2]
    [13h44] Yarflam: "[fichier1]:[fichier2]".split(':')[0] ==> [fichier1]
    [13h44] fred: moui j'ai du mal là, base64 va bien écrire/encoder un fichier dans un autre fichier, c'est ça?
    [13h45] Yarflam: Non pas tout à fait. Il va suivre l'arborescence pour créer des imbrications de base64.
    [13h46] Yarflam: Et le résultat sera sauvegardé dans un fichier texte
    [13h46] Yarflam: base64(base64(fichier1:fichier2):base64(fichier1))
    [13h47] fred: exemple : encode(file, file_64), possible?
    [13h48] Yarflam: Comment tu comprends le fonctionnement ? T'as dernière ligne m'est indifférente.
    [13h49] fred: Je partirais du répertoire racine
    [13h49] fred: j'encode tous les fichiers
    [13h49] fred: je place l'objet fichier encodé dans une liste
    [13h50] fred: j'écris tout dans un seul fichier

    [13h51] Yarflam: Hum je vois. Mais si y a 10 récursions comment tu t'en sors pour repérer l'arborescence ?
    [13h51] fred: os.walk
    [13h52] Yarflam: C'est une solution
    [13h52] Yarflam: J'avais pas imaginé ça comme ça. Mais oui c'est possible après tout.
    [13h52] fred: ok
    [13h53] fred: walk parcours récursivement l'arborescence des répertoires

    Bonne chance !
    Dernière modification par Yarflam, 31 mars 2013, 16h30.
    ~ Yarflam ~

    ❉ L'Univers se dirige vers son ultime perfection ❉
Chargement...
X