Python 是否移动csv文件中列出的文件?

Python 是否移动csv文件中列出的文件?,python,csv,Python,Csv,我一直在尝试使用以下代码移动csv列表中列出的文件。但它最多只能复制列表中的最后一个文件,而不会复制其余文件。 我看到的每一个例子都在不断地碰壁,列出了我做错了什么 我的简历列表将包含如下列表: 12355,12355.jpg 这是我的密码 import os import shutil import csv keys={} with open('shuttle_image.csv', 'r') as f: reader = csv.reader(f, delimiter = ',') f

我一直在尝试使用以下代码移动csv列表中列出的文件。但它最多只能复制列表中的最后一个文件,而不会复制其余文件。 我看到的每一个例子都在不断地碰壁,列出了我做错了什么

我的简历列表将包含如下列表:

12355,12355.jpg
这是我的密码

import os
import shutil
import csv
keys={}
with open('shuttle_image.csv', 'r') as f:
 reader = csv.reader(f, delimiter = ',')
 for rowDict in reader:
    keys[rowDict[0]] = rowDict[1]
    print (rowDict)

dir_src = 'C:\\Users\\Willie\\Desktop\\Suppliers Dropship\\hunting\\'
dir_dst = 'C:\\image\\' 
for file in os.listdir(dir_src):
    src_file = os.path.join(dir_src, file)
    dst_file = os.path.join(dir_dst, file)
    if file in rowDict[1]:
        shutil.move(src_file, dst_file)

我认为这样做是可行的(未经测试):

作为优化,除非您需要
字典进行其他处理,否则您可以更改第一部分,使其仅创建第二个
for
循环中使用的
有效_文件
set变量:

valid_files = set()  # empty set
with open('shuttle_image.csv', 'r') as f:
    for rowDict in csv.reader(f, delimiter=','):
       valid_files |= {rowDict[1]}  # add file name to set
       print(rowDict)  # if desired

我认为这样做是可行的(未经测试):

作为优化,除非您需要
字典进行其他处理,否则您可以更改第一部分,使其仅创建第二个
for
循环中使用的
有效_文件
set变量:

valid_files = set()  # empty set
with open('shuttle_image.csv', 'r') as f:
    for rowDict in csv.reader(f, delimiter=','):
       valid_files |= {rowDict[1]}  # add file name to set
       print(rowDict)  # if desired

之所以只能复制最后一个文件(如果是),是因为这一行:

     if file in rowDict[1]:
您正在引用第一个for循环之外的
rowDict
。所以在那个执行时刻,它包含这个循环的最后一个值

如果我正确理解了您正在尝试做的事情,您可以尝试以下类似的操作(未测试的代码):

因此,不是:

  • 使用CSV文件中的所有值构建字典

  • 以某种方式检查源目录中的每个文件是否包含在词典中(这就是我解释的您试图做的)

    • 如果有,就移动它
  • 你可以:

  • 对于从CSV提取的每个文件,请检查其是否存在于源目录中。
    • 如果是,则将其移动到目标目录
  • 这就是你想做的吗


    [如果文件名保持不变,则只需为shutil.move()的第二个参数指定目标目录即可]

    之所以只能复制最后一个文件(如果是),是因为这一行:

         if file in rowDict[1]:
    
    您正在引用第一个for循环之外的
    rowDict
    。所以在那个执行时刻,它包含这个循环的最后一个值

    如果我正确理解了您正在尝试做的事情,您可以尝试以下类似的操作(未测试的代码):

    因此,不是:

  • 使用CSV文件中的所有值构建字典

  • 以某种方式检查源目录中的每个文件是否包含在词典中(这就是我解释的您试图做的)

    • 如果有,就移动它
  • 你可以:

  • 对于从CSV提取的每个文件,请检查其是否存在于源目录中。
    • 如果是,则将其移动到目标目录
  • 这就是你想做的吗


    [如果文件名保持不变,只需为shutil.move()的第二个参数指定目标目录即可]

    我假设rowDict[1]只包含最后一个文件名。您检查了rowDict包含的内容了吗?为什么使用rowDict而不是字典键?我假设rowDict[1]只包含最后一个文件名。您检查了rowDict包含的内容了吗?为什么用rowDict而不是字典键呢?谢谢你,马丁,它确实有用。请允许我问一下,使用错误检查列出未找到或未移动的文件的最佳方法是什么?不客气。一种简单的方法是在成功调用
    shutil.move()
    之后,使用
    valid\u files-={file}
    语句从
    valid\u files
    中删除每个文件名。然后,在移动
    for
    循环结束后,您可以检查其中是否有剩余内容:即
    是否有有效的\u文件:
    打印('some files not found or moved')
    。您还需要将
    shutil.move()
    调用放入一个
    try
    /
    中,除了shutil.Error:
    块,这样任何复制错误都不会导致脚本在出现时终止。谢谢Martin,它确实有效。请允许我问一下,使用错误检查列出未找到或未移动的文件的最佳方法是什么?不客气。一种简单的方法是在成功调用
    shutil.move()
    之后,使用
    valid\u files-={file}
    语句从
    valid\u files
    中删除每个文件名。然后,在移动
    for
    循环结束后,您可以检查其中是否有剩余内容:即
    是否有有效的\u文件:
    打印('some files not found or moved')
    。您还需要将
    shutil.move()
    调用放入
    try
    /
    中,但shutil.Error:
    块除外,以便在出现复制错误时不会导致脚本终止。