[英]Python: Replace one list with another list?
I'm stuck. 我被卡住了。 I'm moving folders around on our network which all have a unique ID into a central location.
我正在网络上四处移动文件夹,这些文件夹都有唯一的ID到中心位置。 There are a few folders with typos and therefore do not match a unique ID in the central location.
有一些带有错别字的文件夹,因此在中心位置与唯一ID不匹配。 I have found the correct IDS but I need to rename these folders before I move them.
我找到了正确的IDS,但是在移动它们之前,我需要重命名这些文件夹。 For example, I have created an excel spreadsheet with the wrong unique ID and in a separate column have the correct ID.
例如,我创建了一个具有错误的唯一ID的excel电子表格,并且在单独的列中具有正确的ID。 Now, I want to rename the folders with the correct ID and then transfer those folders to the central location.
现在,我想使用正确的ID重命名文件夹,然后将这些文件夹转移到中央位置。 My code is....rough because I can't think of a good way to do it.
我的代码很粗糙,因为我想不出一种好方法。 I feel like using a list is the way to go, but since my code is iterating through a folder I'm not sure how to achieve this
我觉得使用列表是一种方法,但是由于我的代码正在通过文件夹进行迭代,因此我不确定如何实现此目的
Edit: I think something like this may be what I'm looking for 编辑:我认为像这样可能就是我要找的
Ex: In Folder A : A file named 12334 SHOULD be renamed 1234. Then moved to the base directory with in folder 1234. 例如:在文件夹A中:应将名为12334的文件重命名为1234。然后移动到文件夹1234中的基本目录中。
Heres my code: 这是我的代码:
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")
Thanks to the answers below here is my final code: 由于下面的答案,这是我的最终代码:
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)
For me the way to go is to read both lists into list objects: 对我而言,方法是将两个列表都读入列表对象:
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
An idea: try to convert the id's to strings. 一个想法:尝试将id转换为字符串。 I mean:
我的意思是:
newname = re.sub('372911000002001','372911000003100',ARN)
Hope it helps! 希望能帮助到你!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.