2013-08-22 16 views
11

私はすでにthis threadを読みましたが、私のコードに実装すると数回の反復でしか動作しません。Pythonは新しいディレクトリにファイルをコピーし、ファイル名がすでに存在する場合は名前を変更します

pythonを使用して、ディレクトリを移動して(ディレクトリを移動することができます)、主にpdfファイル(一意のIDと一致)を別のディレクトリ(ベースディレクトリ)から一致するフォルダ(対応する一意のID) 。私はshutil.copyを使い始めましたが、重複があると既存のファイルを上書きします。

対応するフォルダを検索して、ファイルがすでに存在するかどうかを確認し、複数のファイルが存在する場合は繰り返して名前を付けることができます。

  • コピーファイル1234.pdfは、ベースディレクトリにフォルダに1234
  • 別のPDFを1234.pdfとしてコピーされた場合1234.pdfは
  • 、それを1234_1.pdf名前に存在している場合、それは1234_2だろう.pdf。ここで

私のコードです:

import arcpy 
import os 
import re 
import sys 
import traceback 
import collections 
import shutil 

movdir = r"C:\Scans" 
basedir = r"C:\Links" 

try: 
    #Walk through all files in the directory that contains the files to copy 
    for root, dirs, files in os.walk(movdir): 
     for filename in files: 
      #find the name location and name of files 
      path = os.path.join(root, filename) 
      print path 
      #file name and extension 
      ARN, extension = os.path.splitext(filename) 
      print ARN 

      #Location of the corresponding folder in the new directory 
      link = os.path.join(basedir,ARN) 

      # if the folder already exists in new directory 
      if os.path.exists(link): 

       #this is the file location in the new directory 
       file = os.path.join(basedir, ARN, ARN) 
       linkfn = os.path.join(basedir, ARN, filename) 

       if os.path.exists(linkfn): 
        i = 0 
        #if this file already exists in the folder 
        print "Path exists already" 
        while os.path.exists(file + "_" + str(i) + extension): 
         i+=1 
        print "Already 2x exists..." 
        print "Renaming" 
        shutil.copy(path, file + "_" + str(i) + extension) 
       else: 

        shutil.copy(path, link) 
        print ARN + " " + "Copied" 
      else: 
       print ARN + " " + "Not Found" 
+0

いいえ、構造が異なっています。たとえば、movdirはプロパティ情報のスキャンであり、ストリート名で整理されており、pdfには一意のIDで名前が付けられています。 C:\ Scans \ Main St \ 1234.pdf basedirは、特定のプロパティのすべての情報を一意のIDで並べ替える新しい構造体です。 C:\ Links \ 1234であり、将来は追加のサブフォルダがあるかもしれませんが、今はC:\ Links \ 1234 \ 1234.pdfにコピーしたいと考えています。 – GISKid

+0

check ['filename_fix_existing(filename)']( https://github.com/steveeJ/python-wget/blob/master/wget.py#L72) –

答えて

6

時には始めるのが簡単な場合もあります...入力ミスがあった場合は謝罪し、徹底的にテストする時間はありませんでした。

movdir = r"C:\Scans" 
basedir = r"C:\Links" 
# Walk through all files in the directory that contains the files to copy 
for root, dirs, files in os.walk(movdir): 
    for filename in files: 
     # I use absolute path, case you want to move several dirs. 
     old_name = os.path.join(os.path.abspath(root), filename) 

     # Separate base from extension 
     base, extension = os.path.splitext(filename) 

     # Initial new name 
     new_name = os.path.join(basedir, base, filename) 

     # If folder basedir/base does not exist... You don't want to create it? 
     if not os.path.exists(os.path.join(basedir, base)): 
      print os.path.join(basedir,base), "not found" 
      continue # Next filename 
     elif not os.path.exists(new_name): # folder exists, file does not 
      shutil.copy(old_name, new_name) 
     else: # folder exists, file exists as well 
      ii = 1 
      while True: 
       new_name = os.path.join(basedir,base, base + "_" + str(ii) + extension) 
       if os.path.exists(newname): 
        shutil.copy(old_name, new_name) 
        print "Copied", old_name, "as", new_name 
        break 
       ii += 1 
+0

ありがとう、これを実行すると、 "ii"が定義されていないというエラーが表示されます。私は2.7を使用している可能性があります(3以上の互換性があります)。xと後でコードに統合される可能性のあるArcGISで) – GISKid

+2

いいえ、それは私が台無しにしたことです。それは、index = 0の代わりにii = 1(ゼロの代わりに、他の答えで述べたように)でなければなりません。 – Jblasco

0

私はあなたがそれをここに書いた、少なくともとして、あなたはインデントの問題を抱えていると言うだろう:

while not os.path.exists(file + "_" + str(i) + extension): 
    i+=1 
    print "Already 2x exists..." 
    print "Renaming" 
    shutil.copy(path, file + "_" + str(i) + extension) 

は次のようになります。

while os.path.exists(file + "_" + str(i) + extension): 
    i+=1 
print "Already 2x exists..." 
print "Renaming" 
shutil.copy(path, file + "_" + str(i) + extension) 

これをチェックしてください!

+0

残念なことに、何も変更されませんでした。 – GISKid

+0

さて、私たちは正確に何が動作していないのかを知る必要があります。 – Jblasco

+0

そして、あなたが行った変更をちょっとしたコードを更新することができれば、うまくいかなかったとしてもそれは素晴らしいことです。 – Jblasco

0

私は常にタイムスタンプを使用する - ファイルがすでに存在していることなので、そのことはできません:

import os 
import shutil 
import datetime 

now = str(datetime.datetime.now())[:19] 
now = now.replace(":","_") 

src_dir="C:\\Users\\Asus\\Desktop\\Versand Verwaltung\\Versand.xlsx" 
dst_dir="C:\\Users\\Asus\\Desktop\\Versand Verwaltung\\Versand_"+str(now)+".xlsx" 
shutil.copy(src_dir,dst_dir) 
関連する問題