Как я могу скопировать файлы из папки в несколько папок - PullRequest
0 голосов
/ 25 января 2019

У меня есть 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)

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Я бы сделал это следующим образом:

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 -значение числа файлов, чтобы получить количество нулей, которое вы должны добавить.

0 голосов
/ 25 января 2019

Прежде всего, я бы предпочел использовать 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])

...