Vous n'êtes pas identifié(e).
Pages : 1
Bonjour . Tout est dit dans le titre
j'expliquerais mon code au fur et à mesure . (hésitez pas à dire si on peut mieux faire)
Voila le fonctionnement :
./renamePY.py -h
usage: renamePY.py [-h] [-s] [-d] [argument]
positional arguments:
argument le nouveau nom a donner aux fichiers
optional arguments:
-h, --help show this help message and exit
-s, --suppr supprime l'argument du nom des fichiers
-d, --deletespace supprime les espaces du nom des fichiers si donné avec
argument remplace les espaces par l'argument
Passons au code et aux expliquations.
déja les importations
import os
import argparse
Ensuite on récupere la liste des fichiers du dossier courant ( celui ou on se trouve) avec os.getcwd() (recuper le dossier courant comme pwd qui est envoyer à os.listdir()
files = os.listdir(os.getcwd())
Ensuite on creér notre parser et lui rajoute les options . (avec add_argument) Je précise quelques trucs pour l'argument principal( positional arguments)
parser.add_argument("argument",nargs='?', default=0.0, help="le nouveau nom a donner aux fichiers")
Ici "nargs='?'" et "default=0.0" permet de donner une valeur par defaut à l'argument au cas ou celui ci n'est pas renseigner aprés une option . Permet à l'option "-d" de soit remplacer les espaces du non des fichiers par rien si pas d'argument donner ou de remplacer les espaces par l'argument donner (example '_')
voila la construction :
parser = argparse.ArgumentParser()
parser.add_argument("argument",nargs='?', default=0.0, help="le nouveau nom a donner aux fichiers")
parser.add_argument("-s", "--suppr", action="store_true",
help="supprime l'argument du nom des fichiers")
parser.add_argument("-d", "--deletespace", action="store_true",
help="supprime les espaces du nom des fichiers si donné avec argument remplace les espaces par l'argument")
args = parser.parse_args()
argument = args.argument
ensuite créations des fonctions.
Fonction rename . ( appellée par "nom_du_script.py argument") elle va renommer tout les fichiers images du dossier par l'argument en les numerotant . Si l'on veut les renommer avec un nom avec des espaces il suffit d'entourrer l'argument avec des guillemets ( nom_du_script.py "vacance de noếl 2018"
def rename():
for file_num, file_name in enumerate(files):
if file_name.split('.')[-1] in ['jpg', 'png', 'gif', 'jpeg', 'svg']:
os.rename(file_name, "{}_n°{}{}".format(args.argument, file_num, file_name.split('.')[-1]))
Fonction deletespace ( appellée par nom_du_script.py -d argument ou pas d'argument) . Elle commence par tester si un argument à été donner aprés l'option -d pour voir si en remplace les espace par rien ou par l'argument (personnelement je l'utilise comme ceci ( nom_du_script.py -d _)
def deletespace():
if args.argument == 0.0:
args.argument = ''
for file_name in files:
if ' ' in file_name:
os.rename(file_name, file_name.replace(' ', args.argument))
Fonction suppr (Appelée par nom_du_script.py -s ce_que l'on_veut_enlever)ex: nom_du_script.py -s FRENCHE_Xvid
def suppr():
for file_name in files:
if args.argument in file_name:
os.rename(file_name, file_name.replace(args.argument, ''))
La fin du code qui appelle les fonctions par rappord aux options données.
if args.suppr:
suppr()
elif args.deletespace:
deletespace()
elif args.argument:
rename()
Voilà en espérant vous avoir bien expliqué et que le script vous servira .
Je pense que je l'améliorerais pour pouvoir remplacer des caractére par d'autres plus tard , voir aussi utiliser os.path.splitext pour recuperer les extentions de fichier .
En attendant c'est les fêtes Bonne fêtes à vous tous
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import argparse
files = os.listdir(os.getcwd())
parser = argparse.ArgumentParser()
parser.add_argument("argument",nargs='?', default=0.0, help="le nouveau nom a donner aux fichiers")
parser.add_argument("-s", "--suppr", action="store_true",
help="supprime l'argument du nom des fichiers")
parser.add_argument("-d", "--deletespace", action="store_true",
help="supprime les espaces du nom des fichiers si donné avec argument remplace les espaces par l'argument")
args = parser.parse_args()
argument = args.argument
def rename():
for file_num, file_name in enumerate(files):
if file_name.split('.')[-1] in ['jpg', 'png', 'gif', 'jpeg', 'svg']:
os.rename(file_name, "{}_n°{}{}".format(args.argument, file_num, file_name.split('.')[-1]))
def suppr():
for file_name in files:
if args.argument in file_name:
os.rename(file_name, file_name.replace(args.argument, ''))
def deletespace():
if args.argument == 0.0:
args.argument = ''
for file_name in files:
if ' ' in file_name:
os.rename(file_name, file_name.replace(' ', args.argument))
if args.suppr:
suppr()
elif args.deletespace:
deletespace()
elif args.argument:
rename()
Dernière modification par petitegirafe (31-12-2018 18:16:33)
Hors ligne
Je pourrai être de mauvaise foi et dire que de toute façon tu peux le faire en 2 secondes avec bash MAIS ce n'est pas mon cas et le code est très intéréssant merci à toi pour ton premier partage de l'année
Mess With The Bests
Die Like The Rest
Hors ligne
Hello,
Merci pour ton partage
En effet quand on commence on se retrouve souvent à coder des trucs qui existent déjà mais c'est le meilleur moyen d'apprendre
Voici cependant quelques pistes d'amélioration et quelques conseils :
Pourquoi te limiter à des fichiers image pour le rename (j'imagine que c'était pour un besoin perso)
Je ne sais pas quelle version de Python tu as, mais si tu es en 2.X : passe à Python 3, python 2 va un jour finir par disparaître
Commences déjà à commenter ton code, même si là il s'agit d'un programme relativement simple il vaut mieux prendre les habitudes dès le début
C'est dommage que le script doive être lancé depuis le dossier dans lequel il droit travailler. Tu pourrais prendre en compte un chemin de dossier. Et pour tout ce qui est path en python à partir de la 3.4 tu as un super module "pathlib".
C'est ton choix mais moi j'aime bien mettre des print dans mon programme pour savoir où il en est. Ex : Renommage des fichiers en cours...
Puis genre tu print chaque fichier renommé, comme ça tu sais ce que fais ton script en plus ^^
Tu as crée une variable "argument = args.argument" mais tu ne l'utilise pas, tu fais des "args.argument"
Ca c'est encore une histoire de bonnes pratiques, essayes d'avoir un main qui appelle des fonctions au lieu de tout mettre à côté en exécution directe. Ex dans ton cas :
# en début de script avec tes autres imports
import sys
########
...... ajouter à tes fonctions ton argument.. en argument :p
########
def rename(argument):
...
def suppr(argument):
...
def deletespace(argument):
...
########
...... puis en fin de script
########
def main():
files = os.listdir(os.getcwd())
parser = argparse.ArgumentParser()
parser.add_argument("argument",nargs='?', default=0.0, help="le nouveau nom a donner aux fichiers")
parser.add_argument("-s", "--suppr", action="store_true",
help="supprime l'argument du nom des fichiers")
parser.add_argument("-d", "--deletespace", action="store_true",
help="supprime les espaces du nom des fichiers si donné avec argument remplace les espaces par l'argument")
args = parser.parse_args()
argument = args.argument
if args.suppr:
suppr(argument)
elif args.deletespace:
deletespace(argument)
elif args.argument:
rename(argument)
return 0
if __name__== "__main__":
sys.exit(main())
J'ai l'habitude de wrapper mon appel de main dans un sys.exit() car de cette façon dans mon main je peux facilement faire des return avec un int qui sera le return code de mon programme.
Et pourquoi utiliser un main ? Parce que dans ton script actuel tout ce qui n'est pas dans une fonction est une variable globale. Et on a parfois tendance à l'oublier et à réutiliser ces noms dans les fonctions et ça peut poser des problèmes. Là toutes tes variables déclarées dans ton main sont locales à ta fonction.
De plus, si tu n'utilise pas de main et que tu import ton programme dans un autre script, tout le code hors fonction va s'exécuter directement lors de l'import. Avec ton main, le code ne sera executé que lorsque tu appelleras la fonction. Et puis tout simplement ça permet une meilleure lecture du code . Une fois encore ce n'est pas du tout obligatoire mais c'est une bonne pratique.
Voilà, bonne continuation
Dernière modification par Linuz (03-01-2019 12:28:15)
Hors ligne
Bonjour , Merci pour vos retours
Pourquoi te limiter à des fichiers image pour le rename wink (j'imagine que c'était pour un besoin perso)
Effectivement c'est pour des besoins perso
Je ne sais pas quelle version de Python tu as, mais si tu es en 2.X : passe à Python 3, python 2 va un jour finir par disparaître
Je prend note , mais python 3 n'est pas installé sur ma distribution , je vais voir pour cela.
Commences déjà à commenter ton code, même si là il s'agit d'un programme relativement simple il vaut mieux prendre les habitudes dès le début
Ok
C'est dommage que le script doive être lancé depuis le dossier dans lequel il droit travailler. Tu pourrais prendre en compte un chemin de dossier. Et pour tout ce qui est path en python à partir de la 3.4 tu as un super module "pathlib".
C'est ton choix mais moi j'aime bien mettre des print dans mon programme pour savoir où il en est. Ex : Renommage des fichiers en cours...
Puis genre tu print chaque fichier renommé, comme ça tu sais ce que fais ton script en plus ^^
Bien vue , je vais rajouter une option -c pour le chemin du dossier pareil pour les print
Tu as crée une variable "argument = args.argument" mais tu ne l'utilise pas, tu fais des "args.argument"
oublié de l'enlever .... merci . Quelle est la meilleur méthode d'ailleur ? supprimmer argument = args.argument et appeller args.argument ou le laisser et appeller argument
Ca c'est encore une histoire de bonnes pratiques, essayes d'avoir un main qui appelle des fonctions au lieu de tout mettre à côté en exécution directe.
Je prend notes
Donc je reposterais le script avec toutes ces modif dés que possible merci
Dernière modification par petitegirafe (03-01-2019 15:59:32)
Hors ligne
c'est mieux comme ça ? les commentaires viendront plus tard ....
-c le/chemin/du/dossier/ ou pas l'option -c et là dossier courant atteint avec cd (bash)
[17:11:04] petitegirafe @ petitegirafe-System --> : ~ $
./ptgrename.py -c Images/nouveaudossier/ "petite girafe teste"
Images/nouveaudossier/
renommage des fichiers
teste_n°1.png --> petite girafe teste_n°0.png
teste_n°3.jpg --> petite girafe teste_n°1.jpg
teste_n°0.png --> petite girafe teste_n°2.png
teste_n°2.jpg --> petite girafe teste_n°3.jpg
[17:11:12] petitegirafe @ petitegirafe-System --> : ~ $
./ptgrename.py -c Images/nouveaudossier/ -d _
Images/nouveaudossier/
Suppression des espaces par _
petite girafe teste_n°3.jpg --> petite_girafe_teste_n°3.jpg
petite girafe teste_n°1.jpg --> petite_girafe_teste_n°1.jpg
petite girafe teste_n°2.png --> petite_girafe_teste_n°2.png
petite girafe teste_n°0.png --> petite_girafe_teste_n°0.png
[17:11:21] petitegirafe @ petitegirafe-System --> : ~ $
./ptgrename.py -c Images/nouveaudossier/ -s teste
Images/nouveaudossier/
Suppression de teste
petite_girafe_teste_n°2.png --> petite_girafe__n°2.png
petite_girafe_teste_n°3.jpg --> petite_girafe__n°3.jpg
petite_girafe_teste_n°0.png --> petite_girafe__n°0.png
petite_girafe_teste_n°1.jpg --> petite_girafe__n°1.jpg
Le script
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os,sys
import argparse
def rename(argument, files):
print("renommage des fichiers")
for file_num, file_name in enumerate(files):
if file_name.split('.')[-1] in ['jpg', 'png', 'gif', 'jpeg', 'svg']:
os.rename(file_name, "{}_n°{}.{}".format(argument, file_num, file_name.split('.')[-1]))
print("{} --> {}_n°{}.{}".format(file_name,argument, file_num, file_name.split('.')[-1]))
def suppr(argument, files):
print("Suppression de {}".format(argument))
for file_name in files:
if argument in file_name:
os.rename(file_name, file_name.replace(argument, ''))
print("{} --> {}".format(file_name, file_name.replace(argument, '')))
def deletespace(argument, files):
if argument == 0.0:
argument = ''
print("Suppression des espaces par {}".format(argument))
for file_name in files:
if ' ' in file_name:
os.rename(file_name, file_name.replace(' ', argument))
print("{} --> {}".format(file_name, file_name.replace(' ', argument)))
def main():
files = os.listdir(os.getcwd())
parser = argparse.ArgumentParser()
parser = argparse.ArgumentParser()
parser.add_argument("argument",nargs='?', default=0.0, help="le nouveau nom a donner aux fichiers")
parser.add_argument("-c", "--path", help="l'emplacement du dossier")
parser.add_argument("-s", "--suppr", action="store_true",
help="supprime l'argument du nom des fichiers")
parser.add_argument("-d", "--deletespace", action="store_true",
help="supprime les espaces du nom des fichiers si donné avec argument remplace les espaces par l'argument")
args = parser.parse_args()
argument = args.argument
if args.path:
print(args.path)
files = os.listdir(args.path)
os.chdir(args.path)
if args.suppr:
suppr(argument, files)
elif args.deletespace:
deletespace(argument, files)
elif args.argument:
rename(argument, files)
return 0
if __name__== "__main__":
sys.exit(main())
Dernière modification par petitegirafe (03-01-2019 18:17:45)
Hors ligne
Pages : 1