【问题标题】:How can I copy files from a folder into multiple folders如何将文件夹中的文件复制到多个文件夹中
【发布时间】:2019-01-25 11:54:47
【问题描述】:

我在文件夹源中有 130 个文件,我想将每个文件复制到单个文件夹 001、002、003 ... 130(所有这 130 个文件夹都位于目标文件夹中)。

这样每个文件夹都只包含一个文件。 我想出了这个,但可能有点凌乱和多余......而且大多数情况下它不起作用。

import shutil
import os

source = '/Users/JohnCN/photo_database/mugshot_frontal/'
files = os.listdir(source)

for i in files:

    for fold in range(1,131):

        if fold<10:
            destination = "/Users/JohnCN/photo_DBsorted/00%s" %fold
            shutil.move(source+i, destination)

        elif fold in range(10,100):
            destination = "/Users/JohnCN/photo_DBsorted/0%s" %fold
            shutil.move(source+i, destination)

        else:
            destination = "/Users/JohnCN/photo_DBsorted/%s" %fold
            shutil.move(source+i, destination)

【问题讨论】:

  • 你在用python2吗?
  • 我使用的是 Python 3.6.7
  • 您在此问题中使用的字符串格式通常用于 python2,尽管它不推荐用于 python3。从 Python 3.6 版本开始,有可用的 f-string 格式,看起来更方便。

标签: python directory shutil


【解决方案1】:

我会这样做:

import shutil
import os

source = '/Users/JohnCN/photo_database/mugshot_frontal/'
files = os.listdir(source)

for idx, f in enumerate(files):
    destination = '/Users/JohnCN/photo_DBsorted/{d:03d}'.format(d=(idx + 1))
    shutil.move(source + f, destination)

那么,它有什么作用? for idx, f in enumerate(files): 在循环时对文件进行计数,因此您知道文件的索引。要获取目的地,idx 用作目录名称。我假设您知道format{d:03d} 的方法,简单地说,分配给 d 的值应该是 3 个字符长,该值是一个整数,并用零填充(例如 003)。当然,此代码假定您没有 1000 多个文件,在这种情况下,只需增加零的数量即可。例如,您可以计算文件数量的log10-value 以获得您必须添加的零的数量。

【讨论】:

  • 谢谢!你的解释真的很清楚。我还有一个问题要问你:我想从另一个源文件夹复制文件。这次每个人我有 6 张照片(例如,第一人称是 001_L1、001_L2、001_L3、001_R1、001_R2、001_R3)。如何修改它,以便在每次迭代期间将所有这 6 张照片复制到正确的目标文件夹中?
  • @EdoardoAb 这些照片是如何排列的?每个人都已经有自己的文件夹了吗?可以保证os.listdir 给出的照片类似于[PersonA_1, PersonA_2,...,PersonA_6,PersonB_1,...]?
  • 是的,我会使用之前使用过的相同文件夹 (001,002,003 ... 130)。是的,源文件夹中的照片以os.listdir 给出的方式排列:[001_L1.jpg, 001_L2.jpg, 001_L3.jpg, 001_R1.jpg, 001_R2.jpg, 001_R3.jpg, 002_L1.jpg, 002_L2.jpg, 002_L3.jpg, 002_R1.jpg, 002_R2.jpg, 002_R3.jpg ...]
  • 啊,我想我现在明白了。我的名字已经是001_L1, 001_L2,... 并且您只想根据第一个数字将它们复制到文件夹001,002,003,... 是对的吗?在这种情况下,您只需使用f.split('_') 拆分文件名,目录将是它的第一部分,即target_dir = f.split('_')[0]
  • 只要os.listdir 以相同的顺序返回它们,它就会起作用。如果由于任何原因订单不再正确,则该检查将不起作用。但是上面的解决方案不需要任何这样的检查,所以我不知道你为什么要这样做。
【解决方案2】:

首先,如果我想复制文件而不是移动,我宁愿使用shutil.copy。虽然,主要思想并不依赖于它。此外,这里不需要if 语句以及内部循环:

files = os.listdir(source)

for i in range(len(files)):
    file = os.path.join(source, files[i]) 
    shutil.copy(file, os.path.join(source, '%03d'%i, files[i])

【讨论】:

  • 你的速度更快 :(
猜你喜欢
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 2013-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多