user@linuxtrack:~ $ python -c 'print("Soyez les bienvenus !")'

Vous n'êtes pas identifié(e).

#1 31-12-2018 17:54:03

petitegirafe
Membre

renommer des fichiers avec python

Bonjour . Tout est dit dans le titre  stone 
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 .  stone
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 big_smile   Bonne fêtes à vous tous guantas stone

#!/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

#2 02-01-2019 21:34:35

ZeR0-@bSoLu
Membre

Re : renommer des fichiers avec python

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 smile


Mess With The Bests
Die Like The Rest

Hors ligne

#3 03-01-2019 11:56:40

Linuz
Membre

Re : renommer des fichiers avec python

Hello,

Merci pour ton partage smile

En effet quand on commence on se retrouve souvent à coder des trucs qui existent déjà mais c'est le meilleur moyen d'apprendre  big_smile

Voici cependant quelques pistes d'amélioration et quelques conseils :

  1. Pourquoi te limiter à des fichiers image pour le rename wink (j'imagine que c'était pour un besoin perso)

  2. 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 stone

  3. 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

  4. 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".

  5. 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 ^^

  6. Tu as crée une variable "argument = args.argument" mais tu ne l'utilise pas, tu fais des "args.argument"

  7. 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 big_smile. Une fois encore ce n'est pas du tout obligatoire mais c'est une bonne pratique.

Voilà, bonne continuation  big_smile

Dernière modification par Linuz (03-01-2019 12:28:15)

Hors ligne

#4 03-01-2019 15:54:17

petitegirafe
Membre

Re : renommer des fichiers avec python

Bonjour , Merci pour vos retours  smile 

Linuz a écrit :

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  big_smile

Linuz a écrit :

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  check

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  check pareil pour les print wink

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 wink 

Donc je reposterais le script avec toutes ces modif dés que possible merci  merci

Dernière modification par petitegirafe (03-01-2019 15:59:32)

Hors ligne

#5 03-01-2019 18:01:52

petitegirafe
Membre

Re : renommer des fichiers avec python

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 stone

#!/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

Pied de page des forums