IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Création d'un code Python


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2020
    Messages : 10
    Par défaut Création d'un code Python
    Bonjour à tous,

    J'essaie de comprendre Python via des tutos et j'aurais besoin d'un coup de main pour créer un code car j’atteins mes limites de compréhension.
    Si quelqu'un pourrait me créer ce code, ça serait vraiment top.

    Voici ma la situation :
    Je travaille sur mac Catalina.
    Le dossier principal est nommé Encode sur le bureau
    Dans ce dossier se trouve trois autres dossiers : M, X et Z
    A l'intérieur des dossiers M et X se trouvent un nombre important de fichiers SGA.
    Il y a le même nombre de fichiers dans chaque dossier et le nom de la liste des fichiers est similaire dans chaque dossier.
    Le dossier Z est vide, il servira de destination.

    Et voici ma demande de code :
    - Je souhaiterais faire un copie des fichiers du dossiers X dans le dossier Z.
    - Mais pour chaque fichier copié, il y a une exception dès qu'il lira la première chaine de caractère qui commence par "0xA1, 0x04, 0x04, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x04, 0xA4, 0x01, 0x01" il ne faut pas la copier ainsi que les 1262 octets qui suivent cette chaine.
    - A la place il faut aller trouver le fichier qui porte le même nom que celui qu'on est en train d’analyser et qui se trouve dans le dossier M, trouver la première chaine de caractère qui commence par "0xA1, 0x00, 0x04, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x04, 0xA4, 0x01, 0x01" et la copier à la place de l'autre chaine en prenant aussi les 1262 octets qui suivent cette chaine.
    - Cette manipulation devra être faite sur la deuxième chaine de caractère trouvée, la troisième, et ainsi de suite en faisant le même ordre sur les chaînes remplacées : deuxième pour deuxième, troisième pour troisième.....

    Voilà, si vous souhaitez, je mets à disposition deux fichiers test dans mon drive :
    pour info le fichier présentes 45 chaines de caractères
    https://drive.google.com/file/d/191M...usp=drive_link

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 049
    Par défaut
    Bonjour @LG3058,

    J'essaie de comprendre Python via des tutos et j'aurais besoin d'un coup de main pour créer un code car j’atteins mes limites de compréhension.
    Nous ne voyons pas vos limites, aucun code n'est apparent.

    Si quelqu'un pourrait me créer ce code, ça serait vraiment top.
    Il faut prendre le temps pour cela, chacun ayant ses occupations, il faut une motivation qui montre que de votre côté vous y mettez du vôtre !

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 815
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par LG3058 Voir le message
    J'essaie de comprendre Python via des tutos et j'aurais besoin d'un coup de main pour créer un code car j’atteins mes limites de compréhension.
    Tuto papier (ou équivalent) ou vidéo ? Si c'est (comme je le crois) vidéo alors ça part mal. Pourquoi je le crois ? Parce que si c'était un tuto papier (ou équivalent pdf) tu pourrais lire, avancer, reculer, copier les exemples et regarder le résultat et cela repousserait réellement ces limites. Surtout que tu es enseignant donc tu sais comment enseigner et surtout faire apprendre !!!

    Citation Envoyé par LG3058 Voir le message
    Si quelqu'un pourrait me créer ce code, ça serait vraiment top.
    Mouais. Déjà après un "si" on n'emploie pas le conditionnel mais l'indicatif. Le conditionnel s'emploie sur la préposition qui suit l'hypothèse et à condition que l'hypothèse soit à l'imparfait de l'indicatif. C'est la préposition qui suit qui est soumise à condition donc c'est elle qui se met au conditionnel. => si quelqu'un pouvait (imparfait de l'indicatif) me créer ce code ce serait (oui là le conditionnel est bien placé) vraiment top. Visiblement tu n'enseignes pas le français.
    Enfin de toute façon on n'est pas là pour ça. Aider oui, donner des exemples (voire parfois des solutions quand la demande est vraiment bateau) oui, mais un forum n'est pas une hotline de concepteurs de codes. Et c'est bien précisé dans les règles.

    Citation Envoyé par LG3058 Voir le message
    Voici ma la situation...
    - Je souhaiterais...
    - Mais pour chaque... qui commence par ... ainsi que...
    - A la place il faut ...qui ...
    - Cette manipulation devra...
    Mouais bon ça m'a l'air bien compliqué. Mais la complication se résout en travaillant simplement. Commence par faire une fonction qui traite UN fichier en recevant en paramètre le fichier (évidemment), un dossier A, un dossier B et un dossier C. Et la fonction prend le fichier dans A ou dans B selon tes règles et le copie dans C.
    Et tant que la fonction ne donne pas le résultat attendu tu ne fais pas autre chose.

    Ensuite, seulement ensuite, tu pourras boucler dans le dossier X (le vrai) et faire traiter chaque fichier de X par la fonction.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 309
    Par défaut
    bonjour

    Si j'ai bien compris, le travail principal est de faire des recherches et remplacements (de même longueur???) dans des fichiers non texte.

    Dans un premier temps : coder une recherche/extraction (d'une seule entête) (dans un seul fichier binaire)
    Dans le second: coder une écriture pour une seule entête (de 1262 octets)

    ensuite c'est gagné, le reste est très simple, faire ces 2 choses dans des boucles

    -----------
    Note: Dans un premier temps, il serait bon de voir si il exite une doc de ce format et pourquoi pas déjà une lib python pour lire/écrire dans ce format

  5. #5
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2020
    Messages : 10
    Par défaut
    Merci messieurs pour vos retours.
    J'ai simplifié la demande que pour l'exception dès qu'il trouvera cette suite d'octets qui commence par "A1 04 04 F6 00 00 00 00 04 A4 01 01" il faut supprimer 1262 octets qui suivent cette suite d'octets. je veux plus de remplacement pour l'instant.
    alors j'ai écris ce code qui a fonctionné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    import os
    import shutil
    import binascii
     
    def process_file(src_path, dest_path):
        with open(src_path, 'rb') as src_file:
            file_content = src_file.read()
     
            # Recherche de la séquence d'octets spécifiée
            sequence_to_find = binascii.unhexlify('A10404F60000000004A40101')
            index = file_content.find(sequence_to_find)
     
            if index != -1:
                # Si la séquence est trouvée, copie du fichier à destination
                shutil.copy2(src_path, dest_path)
     
                # Suppression des 1262 octets suivant la séquence
                modified_content = file_content[:index + len(sequence_to_find)] + file_content[index + len(sequence_to_find) + 1262:]
     
                # Écriture du contenu modifié dans le nouveau fichier
                with open(dest_path, 'wb') as dest_file:
                    dest_file.write(modified_content)
     
    def copy_files_with_exception(src_folder, dest_folder):
        if not os.path.exists(dest_folder):
            os.makedirs(dest_folder)
     
        for root, dirs, files in os.walk(src_folder):
            for file in files:
                src_path = os.path.join(root, file)
                dest_path = os.path.join(dest_folder, file)
     
                process_file(src_path, dest_path)
     
    if __name__ == "__main__":
        src_folder = os.path.join(os.path.expanduser('~'), 'Desktop', 'Encode', 'X')
        dest_folder = os.path.join(os.path.expanduser('~'), 'Desktop', 'Encode', 'Z')
     
        copy_files_with_exception(src_folder, dest_folder)

  6. #6
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2020
    Messages : 10
    Par défaut
    Merci @fred1599 pour les balises sur le précédent message.
    Par contre, il m'a supprimé que la première série de suite d'octets alors qu'il y en a plusieurs.
    Donc j'ai changé le code mais celui-ci ne fonctionne pas. Pourriez-vous me dire où cela bloque.
    Merci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    import os
    import shutil
    import binascii
     
    def process_file(src_path, dest_path):
        with open(src_path, 'rb') as src_file:
            file_content = src_file.read()
     
            # Recherche de toutes les occurrences de la séquence d'octets spécifiée
            sequence_to_find = binascii.unhexlify('A10404F60000000004A40101')
            occurrences = [i for i in range(len(file_content)) if file_content.startswith(sequence_to_find, i)]
     
            if occurrences:
                # Si des occurrences sont trouvées, copie du fichier à destination
                shutil.copy2(src_path, dest_path)
     
                # Suppression des 1262 octets pour chaque occurrence
                modified_content = file_content
                for index in occurrences:
                    modified_content = modified_content[:index + len(sequence_to_find)] + modified_content[index + len(sequence_to_find) + 1262:]
     
                # Écriture du contenu modifié dans le nouveau fichier
                with open(dest_path, 'wb') as dest_file:
                    dest_file.write(modified_content)
     
    def copy_files_with_exception(src_folder, dest_folder):
        if not os.path.exists(dest_folder):
            os.makedirs(dest_folder)
     
        for root, dirs, files in os.walk(src_folder):
            for file in files:
                src_path = os.path.join(root, file)
                dest_path = os.path.join(dest_folder, file)
     
                process_file(src_path, dest_path)
     
    if __name__ == "__main__":
        src_folder = os.path.join(os.path.expanduser('~'), 'Desktop', 'Encode', 'X')
        dest_folder = os.path.join(os.path.expanduser('~'), 'Desktop', 'Encode', 'Z')
     
        copy_files_with_exception(src_folder, dest_folder)

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 815
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LG3058 Voir le message
    Donc j'ai changé le code mais celui-ci ne fonctionne pas.
    As-tu fait comme j'ai dit ? A savoir écrire la fonction de base (copier un fichier) et la tester ? Oui il semble que tu l'as écrite (probablement la fonction "process_file()"). Mais l'as-tu testée ?
    Si tu ne testes pas la base, comment veux-tu que l'ouvrage tienne debout ?

    Citation Envoyé par LG3058 Voir le message
    Pourriez-vous me dire où cela bloque.
    Déjà dans cette fonction tu commences par créer dest_path via shutil.copy2(src_path, dest_path) puis tu l'écrases via open(dest_path, "wb")
    A partir de là, que dire d'autre ?

    Citation Envoyé par LG3058 Voir le message
    Merci @fred1599 pour les balises sur le précédent message.
    Oui donc déjà c'était à toi de les mettre comme indiqué dans les règles et dans ma signature !!!
    Et seul un modérateur peut modifier un post. Or fred1599 n'est pas modérateur.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 049
    Par défaut
    @LG3058,

    Merci @fred1599 pour les balises sur le précédent message.
    what ?

    J'ai rien fais !

    j'ai changé le code mais celui-ci ne fonctionne pas
    ça ne fonctionne pas, n'est qu'un phénomène d'énervement, de pleurs mais en rien une indication qui amène à régler votre problème. Reprenez vous en main, donnez les erreurs indiquées par votre interpréteur, les résultats renvoyés et les résultats attendus, ajoutez des print pour vérifier les valeurs de vos variables, etc... ça c'est utile !

    Pensez-vous que les membres ont le temps de tester vos codes, les déboguer et les corriger pour vous ? On a aussi du travail, on peut vous aider et vous guider, mais il est très rare sauf si guider veut dire donner le code, de donner tout cuit dans le bec un code fonctionnel. C'est à vous de vous investir et de progresser, c'est tout l'intérêt de l'exercice. Si vous ne comprenez pas cela, alors vous n'avez sans doute pas compris l'intérêt d'un forum.

    Donc,
    1. Informer des résultats de votre interpréteur (erreurs ou résultats faux et résultats attendus)
    2. Print de debug sur les variables liées au résultat attendu
    3. Et toutes autres informations qui vous semble utiles pour les membres qui vous lisent
    4. Éviter d'écrire ce qui ne fait pas avancer votre problème

Discussions similaires

  1. [Bouml]modifier le générateur de code python
    Par cedrix57 dans le forum BOUML
    Réponses: 4
    Dernier message: 16/03/2009, 22h12
  2. Réponses: 3
    Dernier message: 08/03/2009, 10h50
  3. conversion d'indentation dans un code python
    Par KINENVEU dans le forum Général Python
    Réponses: 2
    Dernier message: 26/02/2009, 04h04
  4. Réponses: 1
    Dernier message: 24/05/2008, 17h04
  5. [SWIG] dialogue entre code C et code python
    Par dmichel dans le forum Interfaçage autre langage
    Réponses: 12
    Dernier message: 19/12/2007, 21h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo