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

2024-09-28 05:36:56 发布

您现在位置: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

我有目标.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个文件夹中复制图像。因此,不管我如何在目标文件夹中指定它,脚本出于某种原因正在复制图像,因为它读取源的第一行并将其粘贴到目标文件夹的第一行。你知道吗

我需要改变什么?你知道吗


Tags: csvcsvfiletest图像路径文件夹source目标
1条回答
网友
1楼 · 发布于 2024-09-28 05:36:56

只需将新名称放入目标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。链接不是基于文件名的。你知道吗

更进一步,假设您想将所有文件移动到文件夹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

相关问题 更多 >

    热门问题