Python 如何将文件从一个文件夹复制到多个文件夹中

Python 如何将文件从一个文件夹复制到多个文件夹中,python,directory,shutil,Python,Directory,Shutil,我在一个文件夹源中有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:

我在一个文件夹源中有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)
导入shutil
导入操作系统
source='/Users/JohnCN/photo\u database/mugshot\u frontial/'
files=os.listdir(源)
对于文件中的i:
对于折叠范围(1131):

如果fold首先,如果我想复制文件而不是移动,我宁愿使用
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])


首先,如果我想复制文件,但不想移动,我宁愿使用
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])


我会这样做:

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)
那么,它有什么作用呢?
对于枚举(文件)中的idx,f:
在循环时对文件进行计数,以便知道文件的索引。要获取目的地,将idx用作目录名。我假设您知道方法
format
{d:03d}
简单地说,分配给d的值应该是3个字符长,该值是一个整数,并用零填充(例如003)。当然,这段代码假设您没有1000多个文件,在这种情况下,只需增加零的数量。例如,您可以计算文件数的
log10
-值,以获得您必须添加的零数。

我将采用以下方法:

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)
那么,它有什么作用呢?

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

您使用的是python2吗?我使用的是python3.6.7您在这个问题中使用的字符串格式通常用于python2,尽管它对于python3并不反对。由于Python的3.6版本有可用的f字符串格式,这看起来更方便。您使用的是Python 2吗?我使用的是Python 3.6.7您在这个问题中使用的字符串格式通常用于Python 2,尽管它并不反对用于Python 3。由于Python的3.6版本有可用的f字符串格式,因此看起来更方便(谢谢!你的解释真的很清楚。我还有一个问题要问你:我想从另一个源文件夹复制文件。这次每个人我有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,
]是的,我会使用我以前使用过的文件夹(001002003…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…]
啊,我想现在我明白了。我说的对吗,名字已经是
001\u L1,001\u L2,…
了,你只想根据第一个数字将它们复制到文件夹
001002003,
中?在这种情况下,你只需要使用
f.split(“\u”)来分割文件名
并且目录将是它的第一部分,即
target\u dir=f.split(“”“)[0]
。只要
os.listdir
以相同的顺序返回它们,它就可以工作。如果出于任何原因,顺序不再正确,该检查将不起作用。但是上面的解决方案不需要任何此类检查,所以我不知道您为什么要这样做。谢谢!您的解释非常清楚。我还有一个问题要问你:我想从另一个源文件夹复制文件。这一次,每个人我有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,
]是的,我会使用我以前使用过的文件夹(001002003…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…]
啊,我想现在我明白了。我说的对吗,名字已经是
001\u L1,001\u L2,…
了,你只想根据第一个数字将它们复制到文件夹
001002003,
中?在这种情况下,你只需要使用
f.split(“\u”)来分割文件名
而目录将是它的第一部分,即
target\u dir=f.split(“\u”)[0]
。只要
os.listdir
re