【问题标题】:copy and rename images based on a csv managing duplicates python基于 csv 管理重复项 python 复制和重命名图像
【发布时间】:2016-02-29 00:00:21
【问题描述】:

我正在用 python 编写一个脚本来复制和重命名一组基于 csv 的图像。

名为“originals”的图片文件夹如下:

Alpha_1.jpg

Beta_2.jpg

还有 csv。包含:

阿尔法_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()

【问题讨论】:

    标签: python image csv copy rename


    【解决方案1】:

    由于你将映射存储在一个映射中,而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()
    

    【讨论】:

    • os.path.exists 的调用创建了一个竞争条件。如果只是在 try/except 语句中完成,这会更安全。
    • 感谢有用的提示,我发现了类似的问题here
    【解决方案2】:

    这类似于@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)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-04
      • 1970-01-01
      • 2016-03-25
      • 2021-04-17
      • 1970-01-01
      • 2012-11-11
      • 2019-02-26
      • 2014-07-16
      相关资源
      最近更新 更多