2011-04-16 3 views
0

J'ai un outil python pour 'toucher' (utime) un fichier, puis passer à un autre dossier. Toutefois, si le fichier existe déjà dans le dossier de destination, il est écrasé en mode silencieux. Je voudrais vérifier un fichier du même nom dans le dossier de destination et, s'il existe, renommer celui que je déplace à son nom plus '- n' à la fin, où n est un nombre commençant à '1' et, si le fichier avec '-1' à la fin existe déjà, '-2' etc.
Par exemple, disons dans le dossier source est un fichier 'foo.txt', mais il y en a un ' foo.txt 'dans le dossier de destination. Cette fonction devrait retourner '(chemin absolu)/foo -1 .txt'. Donc, j'ai fait une fonction pour vérifier ces circonstances et retourner la chaîne modifiée, donc je peux utiliser le renommer plus tard et ne pas écraser. Cependant, actuellement, si le fichier existe, il ne renvoie rien. Voici le code de la fonction, en supposant ces variables:La fonction python ne se répète pas

fileName - chemin d'accès en entrée, chemin absolu. par exemple. /Users/foo/sourceFolder/bar.txt
index - variable itérateur, fixé à « 1 » au début de chaque fichier en cours d'ouverture (à l'extérieur de la fonction)

def checkExists(fileName): 
    global index 
    print "checkExists(" + fileName + ")" 

    if exists(fileName): 
     splitPath = split(newFile) 
     splitName = splitext(splitPath[1]) 
     newSplitName = splitName[0] + "-" + str(index) 

     index += 1 
     newName = splitPath[0] + "/" + newSplitName + splitName[1] 

     print "newName = " + newName 
    else: 
     print "(else) fileName = " + fileName 
     print "(else) fileName = " + str(type(fileName)) 
     print "" 
     return fileName 

    checkExists(newName) 

Or, il semble que l'intérieur appel pour checkExists() à la fin ne fonctionne pas.

J'espère avoir été clair dans mon explication.
IAmThePiGuy

P.S. Je ne veux pas entendre parler de problèmes de course potentiels avec utime, je sais que les fichiers dans le répertoire source ne seront pas accessibles par quelque chose d'autre.

+0

Vérifiez votre empreinte. –

Répondre

2

Votre problème est que, si le fichier existe, vous ne retournez rien. Je pense que vous avez l'intention d'utiliser la récursivité pour vérifier le nouveau nom de fichier, mais vous ne renvoyez pas le résultat de cet appel. Voici un coup de poignard:

def checkExists(fileName, index=0): 
    print "checkExists(" + fileName + ")" 

    if exists(fileName): 
     splitPath = split(newFile) 
     splitName = splitext(splitPath[1]) 
     newSplitName = splitName[0] + "-" + str(index) 

     index += 1 
     newName = splitPath[0] + "/" + newSplitName + splitName[1] 

     print "newName = " + newName 
     return checkExists(newName, index) # recurse 
    else: 
     print "(else) fileName = " + fileName 
     print "(else) fileName = " + str(type(fileName)) 
     print "" 
     return fileName 

J'ai aussi pris la liberté de déplacer l'appel récursif plus proche de la génération de newName et en supprimant la variable globale et le remplacement par récursion ainsi.

+0

merci, c'est juste ce que je cherchais, je ne me suis pas rendu compte que si je le lui disais de revenir lui-même il se recurse! – cortices

+0

Eh bien, il se recurse dans tous les cas, il ne retournera pas le résultat de la récursivité à l'appelant d'origine. Une solution itérative sera techniquement plus rapide, mais dans votre cas d'utilisation, je doute que vous le remarquerez. – kindall

1

est ici une approche itérative à un problème similaire:

def copyfile(path, dstdir, verbose=True, dryrun=False): 
    """Copy `path` file to `dstdir` directory incrementing name if necessary.""" 
    filename = os.path.basename(path) 
    basename, ext = os.path.splitext(filename) 

    for i in itertools.count(2): 
     destpath = os.path.join(dstdir, filename) 
     if not os.path.exists(destpath): 
      if verbose: 
       print(path, '->', destpath) 
      if not dryrun: 
       shutil.copyfile(path, destpath) 
      return 
     # increment filename 
     filename = "%s_%02d%s" % (basename, i, ext) 
+0

cela ressemble à une bonne réponse, mais c'est bien au-dessus de mes prouesses actuelles en python :-) – cortices

Questions connexes