2015-11-26 63 views
0

我正在使用python中的脚本来复制和重命名一堆基于csv的图像。复制和重命名基于csv的图像管理重复python

名为 “原件” 的图像文件夹是这样的:

Alpha_1.jpg

Beta_2.jpg

以及CSV。包含:

Alfa_1.jpg 4474094_1

Beta_2.jpg 4474094_2

Beta_2.jpg 4474094_3

所以结果应该留下名为 “newnames” 萨姆斯相似图片的新文件夹:

4474094_1.jpg

4474094_2.jpg

4474094_3.jpg

凡4474094_2.jpg和4474094_3.jpg是相同图片Beta_2.jpg

我有以下的代码不能正常工作,请任何意见,我将不胜感激!

import os 
    import csv 
    import sys 
    import shutil 

    def copy_rename(): 
     os.chdir(r"C:\Transformer-SSBI\Original") 
     saved_path = os.getcwd() 
     file_list = os.listdir(saved_path) 
     src_dir= r"C:\Transformer-SSBI\Originals" 
     dst_dir= r"C:\Transformer-SSBI\Newnames" 

     IDs = {} 
     with open (r'transformer.csv','rb') as csvfile:  
       Reader = csv.reader(csvfile, delimiter = ';') 
       for row in Reader: 
         IDs[row[0]] = row[1]+'.jpg' 


       for row in IDs: 
         for file_name in file_list:  
           if file_name in row:           
             oldname = shutil.copy(file_name,dst_dir) 
             newname = IDs[file_name] 
             os.rename(oldname, newname) 


copy_rename() 

回答

0

因为你存储在地图的映射,Beta_2.jpg被重命名为两个文件,也可以在地图上只有一个键,所以它只会被重新命名为4474094_3.jpg,不4474094_2.jpg,可以避开施工图的,只是做了更名,而迭代的CSV文件:

import os 
import csv 
import sys 
import shutil 

def copy_rename(): 
    src_dir= r"C:\Transformer-SSBI\Originals" 
    dst_dir= r"C:\Transformer-SSBI\Newnames" 
    or.chdir(dst_dir) 
    with open (r'transformer.csv','rb') as csvfile:  
     Reader = csv.reader(csvfile, delimiter = ',') 
     for row in Reader: 
      oldname=row[0] 
      newname=row[1]+".jpg" 
      if os.path.exists(src_dir+"\\"+oldname): 
       shutil.copy(src_dir+"\\"+oldname,dst_dir)    
       os.rename(oldname, newname) 
copy_rename() 
+0

谢谢!有用!! – NachoR

+1

对'os.path.exists'的调用会创建竞争条件。如果只是在'try/except'语句中完成,这将更安全。 – eestrada

+0

感谢您的有用提示,我发现类似的问题[这里](http://stackoverflow.com/questions/1586648/race-condition-creating-folder-in-python) – Samuelliyi

0

这就好比@Samuelliyi的答案,不同的是它采用os.path.join避免任何种族的条件是(略)更多跨平台。

import os 
import csv 
import sys 
import errno 
import shutil 

def copy_rename(src_dir, dst_dir, csv_path=None): 
    if csv_path is None: 
     csv_path = os.path.join(dst_dir, 'transformer.csv') 

    with open (csv_path, mode='rb') as csvfile:  
     Reader = csv.reader(csvfile, delimiter = ',') 
     for row in Reader: 
      oldname = row[0] 
      newname = row[1] + os.path.splitext(oldname)[1] 
      oldpath = os.path.join(src_dir, oldname) 
      newpath = os.path.join(dst_dir, newname) 
      try: 
       # the rename is implicit in the copy operation 
       shutil.copy(oldpath, newpath) 
      except OSError as e: 
       # only raise exception if it is something other than the file 
       # not existing 
       if e.errno != errno.ENOENT: 
        raise 

src_dir= r"C:\Transformer-SSBI\Originals" 
dst_dir= r"C:\Transformer-SSBI\Newnames" 
copy_rename(src_dir, dst_dir) 

此外,该功能现在越来越普遍,并可以对具有相同结构的任何两个目录中使用(不硬编码你可以通过什么作为参数)。