2009-11-08 8 views
-1

La question est liée à la answer à propos de renommer les fichiers récursivement.Python: Comment remplacer les tirets dans les noms de fichiers?

Le code, modifié pour remplacer les tirets, ne fonctionne pas avec des cas tels que:

./Beginners Tools/Hello's -Trojans-/bif43243 
./Linux/Nux Col - 1 Works (TEX & Pdf) - T'eouhsoe & More (33323 - 34432) 
./Git/peepcode-git-mov/c6_branch_merge.mov 
./haskell/OS 2007 - T aoue 
./B Sites for Get-Big 

Il a collaboré avec des cas tels que:

./oeu'oeu - X ee ls - Feb 2008.pdf 

donc je dois analyser les données. Comment puis-je remplacer correctement les tirets?

[Détails]

Le code est le lien, mais changé pour remplacer "-":

import os 
for dirpath, dirs, files in os.walk(your_path): 
    for filename in files: 
     if '&' in filename: 
      os.rename(
       os.path.join(dirpath, filename), 
       os.path.join(dirpath, filename.replace('-', '_')) 
      ) 

Le Python ne remplace pas tous les tableau de bord. Je pense que c'est parce que les noms contiennent des signes spéciaux qui ont arrêté le script plus tôt. Donc, je rencontrais des erreurs dans Scilla:

tar cvzf sed_backup.tar.gz `find documents | sed s/\.*/\'\&\'/` 
tar: rojans-: Cannot stat: No such file or directory 
tar: Error is not recoverable: exiting now 

En raison des signes « « « et » - « toujours laissé les noms, le goudron-commande interpréter l'expression » » » comme une fin pour la trouver-commande et "- "comme un signe d'option dans le chemin" ./Beginners Outils/Bonjour de -Trojans-/bif43243"

+2

La réponse que vous liez à des utilisations os.walk. Par conséquent, il est récursif. – unutbu

+0

Il serait utile si vous avez posté l'extrait de code qui remplace les tirets, avec l'erreur que vous obtenez. –

Répondre

1

Votre problème est probablement le guillemet simple, la parenthèse et les tirets. Vous pouvez soit leur échapper ou les remplacer.

En fait en regardant votre édition, le code original auquel vous avez lié est de remplacer les caractères dans le nom de fichier pas le chemin entier. Vous devez échapper aux caractères du chemin:

 
esc_dirpath = dirpath.replace('-','\-') 

qui est assez simpliste, on pourrait aussi utiliser une expression régulière pour échapper à un ensemble de caractères.

Je vous recommande d'exécuter cette commande et d'imprimer les cas spéciaux avant et après l'échappement/le remplacement de ces caractères avant de faire le renommer.

+0

Mieux vaut en faire un commentaire. –

+0

@ e-satis: vient de le faire, merci –

2

le os.path.walk est à portée de main pour traverser, un exemple simple des arbres du système de fichiers:

import os, shutil 

def rename_file(arg, dirname, filename): 
    filepath = os.path.join(dirname, filename) 
    # check if file meets your rename condition here 
    if os.path.isfile(filepath): 
     new_name = "something" 
     shutil.move(filepath, os.path.join(dirname, new_name) 

os.path.walk(base_dir, rename_file, None) 

Salutations Arthur

+2

Si vous utilisez Python 2.6 ou plus récent, os.path.walk est obsolète au profit de os.walk;) –

Questions connexes