2013-08-23 3 views
0

Я застрял. Я перемещаю папки в нашей сети, у которых есть уникальный идентификатор в центральном месте. Есть несколько папок с опечатками и поэтому не соответствуют уникальному идентификатору в центральном расположении. Я нашел правильную IDS, но мне нужно переименовать эти папки, прежде чем переместить их. Например, я создал таблицу Excel с неправильным уникальным идентификатором, а в отдельном столбце - правильный идентификатор. Теперь я хочу переименовать папки с правильным идентификатором, а затем перенести эти папки в центральное место. Мой код ... грубый, потому что я не могу придумать, как это сделать. Я чувствую, что использование списка - это путь, но поскольку мой код выполняет итерацию через папку, я не уверен, как это сделать.Python: Заменить один список другим списком?

Редактировать: Я думаю, что что-то вроде this может быть тем, что я ищу

Ex: в папку A: файл с именем 12334 должен быть переименован 1234. Затем переехал в базовый каталог с в папке 1234.

Heres мой код:

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

movdir = r"C:\Scans" 
basedir = r"C:\Links" 
subfolder = "\Private Drain Connections" 

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) 

      #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 not os.path.exists(link): 
       newname = re.sub(372911000002001,372911000003100,ARN) 
       newname =re.sub(372809000001400,372909000001400,ARN) 
       newname =re.sub(372809000001500,372909000001500,ARN) 
       newname =re.sub(372809000001700,372909000001700,ARN) 
       newname = re.sub(372812000006800,372912000006800,ARN) 
       newname =re.sub(372812000006900,372912000006900,ARN) 
       newname =re.sub(372812000007000,372912000007000,ARN) 
       newname =re.sub(372812000007100,372912000007100,ARN) 
       newname =re.sub(372812000007200,372912000007200,ARN) 
       newname =re.sub(372812000007300,372912000007300,ARN) 
       newname =re.sub(372812000007400,372912000007400,ARN) 
       newname =re.sub(372812000007500,372912000007500,ARN) 
       newname =re.sub(372812000007600,372912000007600,ARN) 
       newname =re.sub(372812000007700,372912000007700,ARN) 
       newname =re.sub(372812000011100,372912000011100,ARN) 


       os.rename(os.path.join(movdir, ARN, extension), 
       os.path.join(movdir, newname, extension)) 
       oldpath = os.path.join(root, newname) 
       print ARN, "to", newname 
       newpath = basedir + "\\" + newname + subfolder 
       shutil.copy(oldpath, newpath) 
       print "Copied" 

except: 
    print ("Error occurred") 

Благодаря ответам ниже вот мой окончательный код:

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

movdir = r"C:\Scans" 
basedir = r"C:\Links" 
subfolder = "\Private Drain Connections" 


import string 

l = ['372911000002001', 
'372809000001400', 
'372809000001500', 
'372809000001700', 
'37292200000800' 
] 
l2 = ['372911000003100', 
'372909000001400', 
'372909000001500', 
'372909000001700', 
'372922000000800' 
] 

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) 

      #file name and extension 
      ARN, extension = os.path.splitext(filename) 
      oldname = str(ARN) 
      #Location of the corresponding folder in the new directory 
      link = os.path.join(basedir, ARN) 

      if not os.path.exists(link): 
       for ii, jj in zip(l, l2): 
        newname = re.sub(ii,jj, ARN) 
        newname = str(newname) 
        print path 
        newpath = os.path.join(root, oldname) + extension 
        print "new name", newpath 
        os.rename(path, newpath) 
        print "Renaming" 
        newpath2 = basedir + "\\" + newname + subfolder 
        shutil.copy(newpath, newpath2) 
        print "Copied" 
       if newname != ARN: 
        break 


      else: 
       continue 

except: 
    print ("Error occurred") 
    tb = sys.exc_info()[2] 
    tbinfo = traceback.format_tb(tb)[0] 
    pymsg = "PYTHON ERRORS:\nTraceback Info:\n" + tbinfo + "\nError Info:\n " + \ 
     str(sys.exc_type)+ ": " + str(sys.exc_value) + "\n" 
    msgs = "GP ERRORS:\n" + arcpy.GetMessages(2)+ "\n" 
    print (pymsg) 
    print (msgs) 
+2

... Это немного больше, чем просто заменить список ... –

+0

@ IgnacioVazquez-Abrams У меня есть другая часть кода работает и работает, мне просто нужен более эффективный способ замены плохих имен. – GISKid

+0

Эффективный или элегантный? Сколько неправильных папок мы говорим? – Jblasco

ответ

1

Для меня путь, чтобы прочитать оба списка в список объектов:

list1 = ["372911000002001", "372809000001400", "372809000001500"] 
list2 = ["372911000003100", "372909000001400", "372909000001500"] 
for ii, jj in zip(list1, list2): 
    newname = re.sub(ii,jj,ARN) #re.sub returns ARN if no substitution done 
    if newname != ARN: 
     break 
+0

Спасибо, он отлично работает, я обновлю свой код выше – GISKid

0

идея: попытаться преобразовать идентификаторы в строки. Я имею в виду:

  newname = re.sub('372911000002001','372911000003100',ARN) 

Надеюсь, это поможет!