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

Я сделал скрипт на Python, который может брать все изображения с жесткого диска, а затем перемещать их в новую папку на жестком диске. Таким образом, все изображения, вложенные глубоко в случайные подкаталоги, могут быть найдены и помещены в эту папку.

Мне нужно отсортировать более 830 ГБ фотографий.

Однако в 1486-м файле программа не вылетает и не зависает, не завершает работу, а просто останавливается.

Вот мой код;

    # For each file in the drive
    for root, dirs, files in os.walk(drive):
        # For each name in the files
        for file in files:
            if "ImageSorter" in root:
                break;

            file_name = os.path.splitext(file)[0]
            extension = os.path.splitext(file)[1]

            # Iterate through each supported file extension
            # in our list
            if extension in supported_extensions:
                # If this is the first file being found
                if images_found < 1 and images_moved < 1:
                    # Init the folder
                    init_moveto_folder()

                images_found += 1

                image_dir = os.path.join(root, file);
                # Move the file
                shutil.move(image_dir, drive + "\\ImageSorter\\" + file_name + "_" + str(images_moved + 1) + extension)
                images_moved += 1

                if not extension in found_extensions:
                   found_extensions.append(extension)

                print(images_moved)
        sleep(0.01)

Если кто-нибудь знает, в чем проблема, дайте мне знать.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
104
1

Ответы 1

Я думаю, что проблема может заключаться в том, как os.walk перебирает диск и как взаимодействует целевая папка.

Вот немного реорганизованная и упрощенная версия вашего кода. Фактический вызов перемещения закомментирован, поэтому вы можете сначала проверить код, чтобы убедиться, что он делает то, что вы хотите. Надеюсь это поможет!

init_moveto_folder()  # Only check initialization once

for root, dirs, files in os.walk(drive):  # For each file in the drive
    if 'ImageSorter' in root:  # Don't bother with the ImageSorter folder 
        dirs[:] = []  # Clear out the subdirectory list so `os.walk` doesn't go there
        continue
    for file in files:
        file_name, extension = os.path.splitext(file)
        if extension not in supported_extensions:
            found_extensions.append(extension)
            continue  # Extension not supported; continue
        images_found += 1
        source_path = os.path.join(root, file)
        target_path = '%s\\ImageSorter\\%s_%s%s' % (
            drive,
            file_name,
            (images_moved + 1),
            extension,
        )
        print('%s => %s' % (
            source_path,
            target_path,
        ))
        #shutil.move(source_path, target_path)
        images_moved += 1
    sleep(0.01)

Это должно отлично работать, спасибо за ответ! Однако я обнаружил, что проблема заключалась в чрезмерном количестве файлов, таких как; Version-0.apversion, созданный iPhoto, это папка, из которой я пытаюсь выполнить фильтрацию. Программа должна сканировать каждый из этих файлов, что может занять некоторое время.

siroot 04.06.2018 12:32

А, ладно. Тогда вы можете добавить какой-нибудь индикатор прогресса! Например, print(root, len(files)) перед for file in files:, чтобы напечатать количество файлов в каждой папке. :)

AKX 04.06.2018 12:35

Другие вопросы по теме