Скрипт Python для поиска и перемещения файлов

Цель приведенного ниже кода Python — найти все файлы .jpg, включенные в любую папку в пределах пути rootdir1, и переместить все файлы в целевую папку.

Когда я выборочно проверял работу кода, я обнаружил несколько jpg, которые не были скопированы в целевую папку. Что мне не хватает в коде?

import os
import shutil

RootDir1 = r'/Users/brianwuollet/Desktop/Takeout'
TargetFolder = r'/Users/brianwuollet/Desktop/Photos'
for root, dirs, files in os.walk((os.path.normpath(RootDir1)), topdown=False):
    for name in files:
        if name.endswith('.jpg'):
            print "Found"
    SourceFolder = os.path.join(root,name)
    shutil.copy2(SourceFolder, TargetFolder) #copies file to target folder

person Brian    schedule 30.07.2016    source источник


Ответы (2)


Вы должны исправить отступ:

import os
import shutil

RootDir1 = r'/Users/brianwuollet/Desktop/Takeout'
TargetFolder = r'/Users/brianwuollet/Desktop/Photos'
for root, dirs, files in os.walk((os.path.normpath(RootDir1)), topdown=False):
    for name in files:
        if name.endswith('.jpg'):
            print "Found"
            SourceFolder = os.path.join(root,name)   #<--- Here is the change
            shutil.copy2(SourceFolder, TargetFolder) #<--- Here is the change

Прямо сейчас вы копируете вне цикла, поэтому не все файлы скопированы

person Ohad Eytan    schedule 30.07.2016
comment
Я думаю, что те строки, которые вы отметили, должны быть отступом еще на один. В противном случае вы будете копировать все файлы, заканчивающиеся на .jpg или нет. - person jedwards; 31.07.2016

Отступ вашего кода неверен. Линии:

SourceFolder = os.path.join(root,name)
shutil.copy2(SourceFolder, TargetFolder) #copies file to target folder

будет выполняться только один раз для каждого каталога, через который проходит os.walk(), в результате чего из каждого каталога будет скопирован только один файл. Измените свой код на это:

for root, dirs, files in os.walk((os.path.normpath(RootDir1)), topdown=False):
    for name in files:
        if name.endswith('.jpg'):
            print "Found"
            SourceFolder = os.path.join(root,name)
            shutil.copy2(SourceFolder, TargetFolder) #copies file to target folder

Теперь каждый файл, оканчивающийся на «.jpg», будет скопирован.

Также возможно, что вы можете перезаписать файлы с тем же базовым именем, и это может привести к потере файлов, если вы на самом деле перемещали файл, а не просто копировали его. Вы можете проверить, существует ли уже файл с таким именем в целевом каталоге, а затем вывести предупреждение или как-то переименовать файл при его копировании.

person mhawke    schedule 30.07.2016