根据两个列表将文件从子目录复制并重命名到不同的子目录?

时间:2018-12-26 01:07:11

标签: python

我在使用python解决小问题。我在20k文件夹中存储了50k张图像。我必须将它们移动到我创建的新文件夹结构中并重命名这些图像。这是具有C:\ TEST \ SOURCE和C:\ TEST \ DESTINATION文件夹结构的测试环境:

我有Src.csv,其中一栏包含这样的图像路径:

C:\TEST\SOURCE\1\a.png
C:\TEST\SOURCE\2\b.jpg
C:\TEST\SOURCE\3\c.jpg
C:\TEST\SOURCE\4\d.jpg
C:\TEST\SOURCE\5\e.jpg

我有Dest.csv,其中有一列,其中每张图像都应位于其中:

C:\TEST\DESTINATION\6\a.png
C:\TEST\DESTINATION\7\b.jpg
C:\TEST\DESTINATION\8\c.jpg
C:\TEST\DESTINATION\9\d.jpg
C:\TEST\DESTINATION\10\e.jpg

这是我尝试做的事情:

import csv
from shutil import copyfile

def load_paths(filename):
    pathdict = {}
    with open(filename) as csvfile:
        filereader = csv.reader(csvfile, delimiter=' ')
        a = 0
        for row in filereader:
           pathdict[a] = ''.join(row)
           a += 1
        csvfile.close()
        return pathdict

srcpaths = load_paths('srcfile.csv')
dstpaths = load_paths('dstfile.csv')

for a in range(len(srcpaths)):
    copyfile(srcpaths[a],dstpaths[a])

我能够复制文件,但是我不确定现在如何重命名它们。我假设我将需要另一个列表来引用要使用的名称。例如,我将拥有一个带有两列的csv,第一列具有路径和原始名称,第二列具有新名称?那行得通吗?以及除了那里的代码外,我该如何重命名这些图像?

更新-复制无法正常进行。它正在从1到6、2到7、3到8、4到9、5到10文件夹中复制图像。因此,无论我如何在目标文件夹中指定脚本,由于某种原因,脚本都会在读取源代码的第一行时复制图像并将其粘贴到目标文件夹中的第一行。

我需要更改什么?

1 个答案:

答案 0 :(得分:1)

只需将新名称放在目标csv文件中:

C:\TEST\DESTINATION\6\aaa.png
C:\TEST\DESTINATION\7\bcc.jpg
...

文件在复制时被重命名。

如果您不想清理源文件夹,请使用move函数,该函数还允许在移动文件时重命名:

import csv
from shutil import move  # import move in place of copyfile
...
for a in range(len(srcpaths)):
    move(srcpaths[a],dstpaths[a])

根据您的评论进行更新:

您的代码使用索引获取源文件和目标文件路径,将两个文件加载到单独的列表中。文件之间的唯一链接是文件的行号。如果我在您的问题中显示的文件中添加行号:

"Src.csv"
[1] C:\TEST\SOURCE\1\a.png
[2] C:\TEST\SOURCE\2\b.jpg
[3] C:\TEST\SOURCE\3\c.jpg
[4] C:\TEST\SOURCE\4\d.jpg
[5] C:\TEST\SOURCE\5\e.jpg

"Dest.csv"
[1] C:\TEST\DESTINATION\6\a.png
[2] C:\TEST\DESTINATION\7\b.jpg
[3] C:\TEST\DESTINATION\8\c.jpg
[4] C:\TEST\DESTINATION\9\d.jpg
[5] C:\TEST\DESTINATION\10\e.jpg

一旦使用列表索引(行号)对它们进行了“匹配”,则source --> destination映射将为:

[1] C:\TEST\SOURCE\1\a.png --> [1] C:\TEST\DESTINATION\6\a.png
[2] C:\TEST\SOURCE\2\b.jpg --> [2] C:\TEST\DESTINATION\7\b.jpg
[3] C:\TEST\SOURCE\3\c.jpg --> [3] C:\TEST\DESTINATION\8\c.jpg
[4] C:\TEST\SOURCE\4\d.jpg --> [4] C:\TEST\DESTINATION\9\d.jpg
[5] C:\TEST\SOURCE\5\e.jpg --> [5] C:\TEST\DESTINATION\10\e.jpg

如果要将文件C:\TEST\SOURCE\1\a.png移动到文件夹10,则需要将目标文件的第一行更改为C:\TEST\DESTINATION\10\a.png。链接不是基于文件名。

要更进一步,假设您要将文件 all 全部移至文件夹10。您的Dest.csv文件将包含:

[1] C:\TEST\DESTINATION\10\a.png
[2] C:\TEST\DESTINATION\10\b.jpg
[3] C:\TEST\DESTINATION\10\c.jpg
[4] C:\TEST\DESTINATION\10\d.jpg
[5] C:\TEST\DESTINATION\10\e.jpg