dans cette Tutoriel Python voyons un script qui changer l'apparence de .txt en .sh dans les fichiers, et il donnera également des autorisations d'exécution pour l'utilisateur. Pour cette tâche, nous allons utiliser des modules que nous avons déjà en Python, le script est valable pour les versions 2.X et 3.X, bien que la sortie soit légèrement différente, le comportement ne change pas, comme nous le verrons plus tard.
NoterLe script à implémenter est destiné à être utilisé sur les systèmes d'exploitation UNIX.
Pour l'exemple, j'ai créé un dossier avec plusieurs fichiers, certains ont une extension .txt et d'autres pas, et il y a aussi un fichier appelé test1.txt qui a une petite commande : ls -l. Il s'agit de vérifier qu'il est bien exécuté, puisque le reste est "collant" car il ne contient pas de données. Le contenu du dossier est visible dans l'image suivante :
Si nous faisons un ls -l nous voyons qu'aucun n'a de permissions d'exécution :
Maintenant, nous allons voir le code complet et il sera expliqué ci-dessous.
import os, sys, stat du sous-processus import Popen, PIPE if (len (sys.argv) <2) : print ("Le chemin à rechercher est requis") sys.exit (0) elif (pas os.path.exists ( sys.argv [1])): print ("Not found:" + str (sys.argv [1])) sys.exit (0) process = Popen (["trouver", sys.argv [1]] , stdout = PIPE, stderr = PIPE) sinon process.stderr.read (): num = 0 pour la ligne dans process.stdout.readlines (): lineNew = line.decode ("UTF-8"). strip () si (".txt" dans lineNew et os.path.isfile (lineNew)): new = lineNew.replace (". txt", ". sh") os.rename (lineNew, new) os.chmod (new, stat. S_IXUSR + stat.S_IRUSR + stat.S_IWUSR + stat.S_IRGRP + stat.S_IXGRP) num + = 1 print ("Travail effectué, modifié", num, "fichiers") else : print ("Erreur")Nous allons commencer par l'explication du code étape par étape, la première chose que nous faisons est d'importer les modules dont nous allons avoir besoin.
importer os, sys, stat à partir du sous-processus importer Popen, PIPEEnsuite, nous vérifierons si un argument nous a été transmis et qu'il s'agit d'une route, pour voir si nous continuons avec le script ou non.
if (len (sys.argv) <2): print ("Le chemin à rechercher est requis") sys.exit (0) elif (pas os.path.exists (sys.argv [1])): print ( " Non trouvé : " + str (sys.argv [1])) sys.exit (0)Pour continuer, nous utilisons Popen du module sous-processus, nous capturons la sortie standard et la sortie d'erreur, nous le faisons à l'aide de TUYAU, Un tuyau. Maintenant, nous pouvons lire à partir du pipeline comme s'il s'agissait d'un fichier.
process = Popen (["trouver", sys.argv [1]], stdout = PIPE, stderr = PIPE)Pour savoir s'il faut continuer, on vérifie s'il y a une erreur (stockée dans process.stderr) avec ce qui suit si :
sinon process.stderr.read() :S'il y a une erreur, elle sera affichée sur l'écran Erreur (c'est pour la branche else, qui n'a pas d'autre explication) et le programme se termine. Sinon, ce que nous allons faire est de lire à partir du tube de sortie standard (sortie standard). On le fait ligne par ligne avec un for, il faut décoder la sortie, dans ce cas j'opte pour UTF-8, car avec l'ASCII cela donnerait des erreurs avec les accents par exemple.
Si nous continuons à regarder la boucle for, nous voyons que nous vérifions si la ligne lue contient .txt, si c'est le cas, il est également vérifié qu'il s'agit d'un fichier (nous ne sommes pas intéressés à changer un dossier qui contient .txt). Si cela est vrai, nous utilisons la fonction remplacer de Python pour changer .txt en .sh, puis avec la fonction chmod du module nous vous donnons des permissions, qui seront l'exécution, la lecture et l'écriture pour l'utilisateur, la lecture et l'exécution pour le groupe et rien pour les autres. Comme vous pouvez le voir, nous utilisons le module stat.
La variable num que vous aurez vue dans le code sert simplement à garder une trace du nombre de fichiers que l'on modifie et donc au final à pouvoir afficher des informations à l'écran.
pour la ligne dans process.stdout.readlines (): lineNew = line.decode ("UTF-8"). strip () if (". txt" dans lineNew et os.path.isfile (lineNew)): new = lineNew. remplacer (". txt", ". sh") os.rename (lineNew, new) os.chmod (new, stat.S_IXUSR + stat.S_IRUSR + stat.S_IWUSR + stat.S_IRGRP + stat.S_IXGRP) num + = 1A la fin de la boucle for, ce que nous faisons, c'est montrer les informations dont nous parlons, c'est là que nous trouverons la différence entre la version 2.x et 3.x, puisque les virgules avant et après num dans la version 2 en font partie dans une liste et dans le 3 il vous montre normal (sans liste).
print ("Travail effectué, modifié", num, "fichiers")Cela peut être modifié pour être interprété de la même manière en utilisant le + et convertir la variable num en chaîne avec la fonction str, ou par %, ci-dessous sont les 2 codes:
print ("Travail terminé, modifié" + str (num) + "fichiers") print ("Travail terminé, modifié% d fichiers"% num)Il a été laissé dans un premier temps pour montrer qu'entre les versions de Python il y a des changements (ils peuvent être petits comme dans ce cas, mais quelque chose qui fonctionne dans la version 3 peut ne pas fonctionner dans la version 2, et vice versa).
Maintenant et presque pour terminer le tutoriel, nous allons exécuter le code et voir comment cela fonctionne, ci-dessous je laisse 2 images de l'exécution, en utilisant Python 3.x dans le premier et dans le second Python 2.x :
Ici, nous apprécions les légères différences. Nous allons maintenant voir à quoi ressemble le dossier de test que nous avons vu auparavant :
Les 4 fichiers qui avaient .txt ont été modifiés et ont maintenant .sh, il semble que seul le fichier test1.sh soit exécutable, c'est parce que le reste ne contient pas de données. Nous allons exécuter le fichier test1.sh, qui ne fera que lancer le ls -l que nous avons dit qu'il contenait, et cela nous aide donc à voir les autorisations.
Le tutoriel se termine ici, au cas où cela vous intéresserait, un lien vers un autre tutoriel sur Python: recherche par nom de fichier.
Avez-vous aimé et aidé ce tutoriel ?Vous pouvez récompenser l'auteur en appuyant sur ce bouton pour lui donner un point positif