基于csv复制和重命名图像管理副本python

基于csv复制和重命名图像管理副本python,python,image,csv,copy,rename,Python,Image,Csv,Copy,Rename,我正在用python编写一个脚本,根据csv复制和重命名一组图像 名为“originals”的图像文件夹如下所示: Alpha_1.jpg Beta_2.jpg 还有csv。包含: Alfa_1.jpg 4474094_1 Beta_2.jpg 4474094_2 Beta_2.jpg 4474094_3 因此,结果应保留在名为“newnames”的新文件夹中的sames图像,如: 4474094_1.jpg 4474094_2.jpg 4474094_3.jpg 其中4474094_2.jpg

我正在用python编写一个脚本,根据csv复制和重命名一组图像

名为“originals”的图像文件夹如下所示:

Alpha_1.jpg

Beta_2.jpg

还有csv。包含:

Alfa_1.jpg 4474094_1

Beta_2.jpg 4474094_2

Beta_2.jpg 4474094_3

因此,结果应保留在名为“newnames”的新文件夹中的sames图像,如:

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

由于将映射存储在映射中,并且将
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()

这与@Samuelliyi answer类似,只是它避免了任何竞争条件,并且通过使用
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)

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

调用
os.path.exists
会创建竞争条件。如果只是在
try/except
语句中执行,则更安全。感谢您提供的有用提示,我发现了类似的问题