【问题标题】:for loop with shutil.copytree wrongly copying ALL files for EVERY single folder带有shutil.copytree的for循环错误地复制了每个文件夹的所有文件
【发布时间】:2022-01-01 05:27:04
【问题描述】:

在这个 for 循环中,它为每个子文件夹复制所有文件夹。所以它需要很长时间,而不是我想要的。所以例如对于文件夹“SPRING2158”,它正在复制从“SPRING00001”开始到“SPRING09999”结尾的所有内容。但它只应复制以“SPRING2158”开头的图像。不是所有的东西。

import os
import shutil 

path = os.path.expanduser('/content/images/FemaleImages')   
for file_name in os.listdir(path):
  if file_name[:10] in nameTrainF:
    shutil.copytree(path+'/', '/content/OutTrainF/'+file_name[:10]+'/')   
  if file_name[:10] in nameValF:
    shutil.copytree(path+'/', '/content/OutValF/'+file_name[:10]+'/')   
  if file_name[:10] in nameTestF:
    shutil.copytree(path+'/', '/content/OutTestF/'+file_name[:10]+'/')   

为了让您了解数据结构,以下是从 RAR 格式中提取数据时的数据。

 !unrar e "/content/drive/My Drive/femaleset.rar" "/content/images/FemaleImages/" 

Extracting  /content/images/FemaleImages/SPRING4796-D7-V40-H50.png    OK 
Extracting  /content/images/FemaleImages/SPRING4796-D7-V40-H60.png    OK 
Extracting  /content/images/FemaleImages/SPRING4796-D7-V40-H70.png    OK 
Extracting  /content/images/FemaleImages/SPRING4796-D7-V40-H80.png    OK 
Extracting  /content/images/FemaleImages/SPRING4796-D7-V40-H90.png    OK 
Extracting  /content/images/FemaleImages/SPRING4798-D7-V0-H0.png      OK 
Extracting  /content/images/FemaleImages/SPRING4798-D7-V0-H10.png     OK 
Extracting  /content/images/FemaleImages/SPRING4798-D7-V0-H100.png    OK 
Extracting  /content/images/FemaleImages/SPRING4798-D7-V0-H110.png    OK 
Extracting  /content/images/FemaleImages/SPRING4798-D7-V0-H120.png    OK 
Extracting  /content/images/FemaleImages/SPRING4798-D7-V0-H130.png    OK 
Extracting  /content/images/FemaleImages/SPRING4798-D7-V0-H140.png    OK 
Extracting  /content/images/FemaleImages/SPRING4798-D7-V0-H150.png    OK 
Extracting  /content/images/FemaleImages/SPRING4798-D7-V0-H160.png    OK 

Colab 中输出文件夹的屏幕截图

为来自 cmets 的其他问题添加了以下更新代码:

path = os.path.expanduser('/content/images/FemaleImages')  
for file_name in os.listdir(path):
  if file_name[:10] in nameTrainF:
    shutil.copy2(os.path.join(path, file_name), os.path.join('/content/OutTrainF/', file_name[:10],'/'))   
  if file_name[:10] in nameValF:
    shutil.copy2(os.path.join(path, file_name), os.path.join('/content/OutValF/', file_name[:10],'/')) 
  if file_name[:10] in nameTestF:
    shutil.copy2(os.path.join(path, file_name), os.path.join('/content/OutTestF/', file_name[:10],'/'))

【问题讨论】:

  • 请添加其余代码。而且我在您的目录结构中看不到任何子文件夹
  • 抱歉,代码中没有子文件夹。我只是用这个词来描述这种情况。但我添加了文件示例输出的屏幕截图。如果我能提供其他任何东西,请告诉我,谢谢!
  • 所以你基本上想根据它们的前缀对图像进行分组?如果是这样的话,use the shell
  • 源目录path+'/'是整个树,不是循环的当前目录。

标签: python google-colaboratory shutil


【解决方案1】:

您不只是复制迭代的当前文件,而是每次都复制path 中的所有内容。使用shutil.copy2() 复制文件,而不是shutil.copytree()

另外,您应该使用os.path.join() 来组合目录和文件名,而不是串联。

for file_name in os.listdir(path):
  prefix = name[:10]
  if prefix in nameTrainF:
    target = os.path.join('/content/OutTrainF/', prefix, '')
    os.makedirs(target, exist_ok=True)
    shutil.copy2(os.path.join(path, file_name), target)   
  if prefix in nameValF:
    target = os.path.join('/content/OutValF/', prefix, '')
    os.makedirs(target, exist_ok=True)
    shutil.copy2(os.path.join(path, file_name), target)   
  if prefix in nameTestF:
    target = os.path.join('/content/OutTestF/', prefix, '')
    os.makedirs(target, exist_ok=True)
    shutil.copy2(os.path.join(path, file_name), target)   

【讨论】:

  • 谢谢@Barmar!但是,当我使用您的代码时,它会给出错误,即它不是目录,如下所示。 NotADirectoryError:[Errno 20] 不是目录:'/content/images/FemaleImages/SPRING2158-D7-V30-H310.png'
  • 如果copytree()不是目录,为什么还要使用它?
  • 使用shutil.copy2() 复制文件。
  • 代码正在处理中,没有错误。但是,由于某些原因,根本没有输出...for file_name in os.listdir(path): if file_name[:10] in nameTrainF: shutil.copy2(os.path.join(path, file_name), os.path.join('/content/OutTrainF/', file_name[:10],'/')) if file_name[:10] in nameValF: shutil.copy2(os.path.join(path, file_name), os.path.join('/content/OutValF/', file_name[:10],'/')) if file_name[:10] in nameTestF: shutil.copy2(os.path.join(path, file_name), os.path.join('/content/OutTestF/', file_name[:10],'/'))
  • 尝试更新后的代码,在os.path.join()调用的末尾添加一个空字符串,这样它将创建一个目录路径。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多