0
votes

Comment renommer des parties du nom de fichier en Python

J'essaie de renommer un certain nombre de fichiers en utilisant Python afin qu'ils suivent une nouvelle convention de dénomination qui ressemble à:

~ / répertoire / aaaa + qq + nom_répertoire + 'Lettre'.

Pour le moment, ils sont dans ce format:

~ / répertoire / nom_répertoire + aaaa + qq + 'Lettre'.

Par exemple, j'ai un répertoire appelé / Users / Test / rename_test / Salmon 2 , et il contient les fichiers suivants:

  • / Users / Test / rename_test / Salmon 2 / Salmon 2 2013 Q4 Letter.pdf
  • / Users / Test / rename_test / Salmon 2 / Salmon 2 2018 Q1 Letter.pdf
  • / Users / Test / rename_test / Salmon 2 / Salmon 2 2015 Q2 Letter.pdf

Je voudrais renommer tous ces fichiers en:

  • / Users / Test / rename_test / Salmon 2/2013 Q4 Salmon 2 Letter.pdf
  • / Users / Test / rename_test / Salmon 2/2018 Q1 Salmon 2 Letter.pdf
  • / Users / Test / rename_test / Salmon 2/2015 Q2 Salmon 2 Letter.pdf

J'ai envisagé d'utiliser os.split pour extraire les positions [-2] et [-3] - depuis celles doit toujours être qq et aaaa - puis renommer le fichier en le déplaçant vers les positions [0] et [1] . Mais j'ai des centaines de répertoires et des milliers de fichiers, donc je crains qu'une faute de frappe ou un fichier qui s'écarte de la convention actuelle puisse entraîner une erreur.

Alors, quelle est la meilleure façon d'aborder cela?


0 commentaires

3 Réponses :


0
votes

Votre idée est fondamentalement saine, mais vous pouvez ajouter au moins deux étapes pour la rendre plus sûre:

  1. utilise une expression régulière qui détecte votre format et génère une erreur si elle ne correspond pas. Par exemple. votre expression régulière pourrait ressembler à ceci:

    ^ Saumon 2 \ d {4} Q \ d {1} Lettre

Vous devrez remplacer Salmon 2 par une variable contenant votre nom de répertoire actuel

  1. Ajoutez un mode "essai à vide" - où les conversions sont simplement imprimées vers stdout - afin que vous puissiez voir ce qui se passerait.

  2. Quoi que vous fassiez, effectuez d'abord une sauvegarde.

Bonus: j'utiliserais probablement pathlib et ses commandes pour ce travail - c'est une interface plus polyvalente que les anciennes méthodes "les noms de fichiers ne sont que des chaînes".


0 commentaires

0
votes

2 commentaires

Je ne pense pas pouvoir utiliser x = '' .join ((x [2], x [3], x [0], x [1], x [3], x [4])) parce que certains des autres répertoires ont des noms de fichiers qui peuvent avoir 6 positions, ou 9, etc. La seule chose qui est cohérente avec la convention de dénomination existante sont les positions [-1] , < code> [- 2] et [-3] . Par exemple, un autre répertoire contient des fichiers nommés / Users / Test / rename_test / Un exemple plus long / Un exemple plus long 2013 Q4 Letter.pdf


oui, alors vous devrez utiliser les positions négatives puis peut-être a [0: index] pour obtenir les positions de départ



0
votes

Vous pouvez essayer d'utiliser re.sub () pour effectuer la manipulation de nom. Par exemple:

import re
import os

old_path = '/Users/Test/rename_test/Salmon 2/Salmon 2 2013 Q4 Letter.pdf'
old_filename = os.path.basename(old_path) # Salmon 2 2013 Q4 Letter.pdf
directory = os.path.basename(os.path.dirname(old_path)) # Salmon 2

new_filename = re.sub(r'('+ directory +')\s([0-9]{4})\s(Q[1-9]?[0-9]*)\sLetter\.pdf',r'\2 \3 \1 Letter.pdf', old_filename) # 2013 Q4 Salmon 2 Letter.pdf

Comme vous pouvez le voir, cette méthode vous permet de définir un modèle, dans lequel vous pouvez identifier les groupes avec des parenthèses (...) , puis vous pouvez réorganisez la chaîne en utilisant ces groupes dans l'ordre que vous souhaitez. Chaque groupe peut être sélectionné avec \ n où n est le numéro de groupe.

Pour plus d'informations: https://docs.python.org/3.6/library/re.html#re.sub


0 commentaires