2015-03-02 1 views
0

J'ai besoin de votre aide désespérément. J'ai entendu dire que python est convivial, mais j'ai du mal à trouver les bonnes commandes.Python: remplacer les noms de fichiers

j'ai des noms de fichiers comme:

cake_cake01_F_A01.ab1 
cake_cake02_F_A02.ab1 
cake_cake03_F_A03.ab1 
cake_cake04_F_B01.ab1 
cake_cake05_F_B02.ab1 
cake_cake06_F_B03.ab1 
cake_cake07_F_C01.ab1 
cake_cake08_F_C02.ab1 
cake_cake09_F_C03.ab1 

dans un dossier avec un répertoire spécifique.

J'ai besoin de les changer pour:

cake_cake01-2101plus.ab1 
cake_cake02-2101plus.ab1 
cake_cake03-2101plus.ab1 
cake_cake04-2101plus.ab1 
cake_cake05-2101plus.ab1 
cake_cake06-2101plus.ab1 
cake_cake07-2101plus.ab1 
cake_cake08-2101plus.ab1 
cake_cake09-2101plus.ab1 

dans le même dossier.

Je suppose que je dois supprimer -10 à -5 positions de ces noms et ajouter -2010plus avant l'extension de fichier. Comment puis-je faire cela en utilisant Python?

+0

J'ai essayé d'utiliser le répertoire complet à l'aide ancien = '_ F_A01' et new = '- 2101plus' et en utilisant os.rename (répertoire complet de chaque fichier, renommer (ancien, nouveau)). Mais dans ce cas j'ai dû assigner le répertoire complet de chaque fichier ce qui n'est pas pratique puisque j'ai des centaines de fichiers nommés comme ci-dessus .... J'espère que je l'explique bien .... –

Répondre

1

Pouvez-vous pas utiliser glob pour obtenir les noms de fichiers pour changer:

import os 
import glob 

filenames = glob.glob('/path/to/cake_cake*.ab1') 
for filename in filenames: 
    newname = filename[:-10] + '-2101plus.ab1' 
    os.rename(filename, newname) 
0

os.listdir()

Retour une liste contenant les noms des entrées dans le répertoire donné par le chemin.

En utilisant regular expressions vous pouvez match() un modèle nécessaire, puis créer un nouveau nom de chaîne précédente en remplaçant seulement la partie de la chaîne que vous souhaitez.

Vous pouvez facilement modifier replacement, ou parcourir tous les répertoires (directory) si nécessaire, ou même modifier le début ou la fin du modèle.

Explication succincte du motif: \d{2} signifie "2 digits", \. correspond au point, [A-Z] correspond à n'importe quelle majuscule.

import os 
import re 

################ Change those ############### 
replacement = '-2101plus' 
directory = '/home/usercat/allmycakes' 

first_part_of_pattern = 'cake_cake\d{2}' 
last_part_of_pattern = 'txt' 
############################################# 

for file_name in os.listdir(directory): 
    if re.match(r'%s_[A-Z]_[A-Z]\d{2}\.%s' % (first_part_of_pattern, last_part_of_pattern), file_name): 

     old_path = directory + '/' + file_name 
     new_file_name = re.sub(r'(%s)_[A-Z]_[A-Z]\d{2}(\.%s)' % (first_part_of_pattern, last_part_of_pattern), 
           r'\1{}\2'.format(replacement), file_name) 

     new_path = directory + '/' + new_file_name 

     os.renames(old_path, new_path)