根据管理重复python的csv复制和重命名图像

时间:2015-11-26 01:45:15

标签: python image csv copy rename

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

名为&#34的图像文件夹;原件"就像:

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()

2 个答案:

答案 0 :(得分:0)

由于您将映射存储在地图中,并且Beta_2.jpg被重命名为两个文件,因此地图中只能有一个键,因此它只会重命名为4474094_3.jpg,而不是{{ 1}},你可以避免构建map,只需在迭代csv文件时重命名:

4474094_2.jpg

答案 1 :(得分: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)

此外,该功能现在更加通用,可以在具有相同结构的任何两个目录上使用(不要硬编码您可以作为参数传递的内容)。