【问题标题】:Copying file to another folder are missing files将文件复制到另一个文件夹缺少文件
【发布时间】:2020-05-03 03:16:32
【问题描述】:

我想知道为什么这段代码没有复制我说的所有文件

源文件夹有大约8000张图片,我想随机复制2719张图片到另一个文件夹,但是运行脚本后,命运文件夹大约有2300-2400张,所以有些图片丢失了。

import os, random
import shutil

src_dir = "C:/Users/X/Desktop/all/"
dst_dir = "C:/Users/X/Desktop/all1/"

file_list = os.listdir(src_dir)

for i in range(2719):
    a = random.choice(file_list)
    shutil.copy(src_dir + a, dst_dir + "/" + a)

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    random.choice 的问题是它可以多次选择同一个文件。随机播放列表并获取前 X 个项目。

    import os, random
    import shutil
    
    src_dir = "C:/Users/X/Desktop/all/"
    dst_dir = "C:/Users/X/Desktop/all1/"
    
    file_list = os.listdir(src_dir)
    random.shuffle(file_list)
    
    for a in file_list[:2719]:
        shutil.copy(src_dir + a, dst_dir + "/" + a)
    

    【讨论】:

    • 恕我直言,random.samples 比洗牌整个列表和切片更适合这个例子。
    【解决方案2】:

    你正在做 2719 个随机选择替换 - 即你已经选择的项目可以再次选择。为避免替换,请使用random.sample

    for a in random.sample(file_list, 2719):
        shutil.copy ...
    

    【讨论】:

      【解决方案3】:

      您没有从列表中删除选定的文件。如果您不删除它们,则可以选择它们两次。这就是为什么您认为代码遗漏了一些文件的原因。试试这个:

      import os, random
      import shutil
      
      src_dir = "C:/Users/X/Desktop/all/"
      dst_dir = "C:/Users/X/Desktop/all1/"
      
      file_list = os.listdir(src_dir)
      
      for i in range(2719):
          a = random.choice(file_list)
          file_list.remove(a)
          shutil.copy(src_dir + a, dst_dir + a)
      

      【讨论】:

      • 列表有限制吗?
      • 列表的“限制”是什么意思?
      • 我试图理解 file_list.remove(a) 行,为什么我需要从列表中删除选择的文件才能工作?
      • 如果不移除,可以选择twise。这就是为什么您认为代码会遗漏一些文件的原因。
      【解决方案4】:

      random.choice 可以从file_list 中选择重复值,因此在复制之前您需要先检查该文件是否已经被复制。如果您想在复制后保持src_dir 中的文件完整而不删除它们,请尝试以下操作:

      import os, random
      import shutil
      
      src_dir = "C:/Users/X/Desktop/all/"
      dst_dir = "C:/Users/X/Desktop/all1/"
      
      file_list = os.listdir(src_dir)
      count = 0
      while count!=2719:
          a = random.choice(file_list)
          if not os.path.exists(a):
              shutil.copy(src_dir + a, dst_dir + "/" + a)
              count+=1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-22
        • 1970-01-01
        • 2014-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多