2011-04-16 14 views
0

私は、ファイルに触れる(utime)ためのpythonツールを持っていて、別のフォルダに移動します。ただし、ファイルがあて先フォルダにすでに存在する場合は、そのファイルは上書きされます。私は、宛先フォルダに同じ名前のファイルがあるかどうか確認したい場合は、その名前に移動している名前を「n」の末尾に変更します。ここで、nは番号の開始です最後に '-1'を含むファイルが既に存在する場合は '-2'など
たとえば、ソースフォルダ内に 'foo.txt'というファイルがありますが、 foo.txt 'もコピー先フォルダに保存します。この関数は '(絶対パス)/ foo -1 .txt'を返します。python関数が繰り返されない

このような状況をチェックして修正した文字列を返す関数を作ったので、後で名前を変更して上書きすることはできません。ただし、現在、ファイルが存在する場合は何も返しません。以下は、これらのベクトルを仮定した関数コードです:

fileName - 入力ファイルパス、絶対パス。例えば/Users/foo/sourceFolder/bar.txt
インデックス - 各ファイルの先頭に「1」に設定イテレータ変数は、開かれている(外部関数へ)

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) 

今では、内側と思われますの最後のcheckExists()が実行されていません。

私の説明ではっきりしていることを希望します。
IAmThePiGuy

P.S.潜在的な競合の問題については、ソースディレクトリ内のファイルにはアクセスできません。

+0

はあなたのインデントを確認してください。 –

答えて

2

ファイルが存在する場合、何も返さないという問題があります。あなたは再帰を使って新しいファイル名をチェックしようとしていると思いますが、その呼び出しの結果を返さないでください。ここで刺します:

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 

私も近いnewNameの世代への再帰呼び出しを移動し、グローバル変数を削除し、同様に再帰してそれを置き換えるの自由を取りました。

+0

おかげさまで、それは私が探していたものです。私がそれを返すように言わざるを得なかったら、それは再発するでしょう! – cortices

+0

まあ、どんな場合でも再帰しま​​す。元の呼び出し元に再帰の結果を返しません。反復的な解決策は技術的に速く実行されますが、ユースケースでは気づくことはありません。 – kindall

1

ここで同様の問題への反復的なアプローチです:

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

は良い答えのように見えますが、それは私の現在の才能の上にあります。 – cortices

関連する問題