If-Else при переименовании файлов в каталоге - PullRequest
0 голосов
/ 23 мая 2018


Я разрабатываю скрипт для переименования файлов в заданном каталоге.Учитывая итеративную природу программирования, я хочу использовать подход «если-еще», чтобы гарантировать, что файлы, которые уже были помечены правильно, могут быть проигнорированы.

files_location = os.listdir(path)
new_entry_name = ['apple', 'orange', 'banana', 'plum', 'strawberry']

i = 0
for entry in files_location:
    if entry == new_entry_name[i]:
        i = i+1
    if entry != new_entry_name[i]:
        os.rename(os.path.join(path,entry), os.path.join(path,new_entry_name[i]))
        i = i+1
    else:
        print('Run complete')

Однако я получаю следующую ошибку, которая, кажется, указываетмои условные операторы if-else не позволяют моим обходным записям, которые уже были переименованы.
Как мы увидим ниже, ранее переименованный файл 'cherry', похоже, блокирует дальнейшее переименование:

[WinError 183] Cannot create a file when that file already exists: 'C:/Users/...\\cherry' -> 'C:/Users/...\\apple'

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Хорошо, вот мое решение.Возможно, не лучшее решение, но я старался сохранить верность вашему коду, как мог.Существует ряд различных соображений для эффективной доставки вашего кода.

1) Как я уже упоминал в своем комментарии, список представляет конечное количество вариантов имен, а также ограничивает вашу возможность итерации, ограничивая итерацию длиной списка.В противном случае вы получите ошибку индекса, когда у вас закончатся элементы в списке.Эта ошибка возникает, когда количество папок в целевом каталоге превышает количество элементов в вашем списке.

2) Должен быть какой-то динамический способ присвоения уникального значения различным именам папок.В большинстве случаев, если вы беспокоитесь о том, чтобы иметь одинаковое имя файла, или знаете, что оно будет одинаковым, вы добавляете что-то, что, как вы знаете, будет уникальным.В этом случае отметка даты / времени.Как вы видете.первые папки будут совпадать с именами элементов списка, затем, когда мы снова перезапустим Apple, она подключится к нашему условному выражению, чтобы убедиться, что его нет в каталоге, и прикрепит уникальное добавление отметки даты / времени.

3) Проверка наличия папок или файлов с одинаковыми именами выполняется с помощью os.path.exists. Это просто еще один способ узнать, существует ли путь и вернет ли логическое значение.Это полезный инструмент для работы с файлами.

Чтобы следовать логике этого кода, я бы создал каталог, настроил пять новых папок.Запустите этот скрипт.Вы увидите все уникальные имена в каталоге.Теперь добавьте две новые папки в каталог и снова запустите скрипт.Вы должны получить яблоко (дата / время) и апельсин (дата / время) и все остальные оригиналы, которые все еще там.

import os
import datetime
from time import sleep

path = 'your target directory'


files_location = os.listdir(path)
new_entry_name = ['apple', 'orange', 'banana', 'plum', 'strawberry']

i = 0

for folder in files_location:  # STARTS ITERATING THROUGH FOLDERS IN TARGET DIRECTORY
    sleep(3)
    print('ON THIS FOLDER: ' + folder)
    if folder in new_entry_name:  # IF THE FOLDER NAME IS IN LIST, THEN PASS
        print('Folder: ' + folder + ' is in list')
        pass

    else:
        print(folder + ' is not in the list')
        print('Checking if proposed folder name ' + new_entry_name[i] + ' is in directory')

        if os.path.exists(os.path.join(path, new_entry_name[i])):  # CHECKS NEW FOLDER NAME BEFORE RENAMING
            print('Proposed name is taken, creating alternate')
            currentDT = datetime.datetime.now()
            new_name = new_entry_name[i] + currentDT.strftime('%Y%m%d%H%M%S')  # ATTACHES DATETIME TO LIST ITEM
            print('Renaming with alternate name')
            os.rename(os.path.join(path, folder), os.path.join(path, new_name))  # RENAMES WITH DATETIME
            if i == 4:  # AVOIDS LIST INDEX ERROR BY CYCLING i BACK TO APPLE WHEN THE LIST WOULD BE EXHAUSTED
                i -= 4
            else:
                i += 1

        else:
            # RENAMES FOLDER IF IT DOESN'T EXIST IN DIRECTORY
            print('Renaming folder')
            os.rename(os.path.join(path, folder), os.path.join(path, new_entry_name[i]))
            if i == 4:
                i -= 4
            else:
                i += 1

Дайте мне знать, если код не запускается.Кроме того, не стесняйтесь спрашивать, нужно ли мне что-то прояснить или помочь вам двигаться в правильном направлении.

0 голосов
/ 23 мая 2018

Чтобы прояснить проблему, настройте следующее:

Создайте каталог с пятью новыми папками - Папка (1), Папка (2) и т. Д.

Кроме того, измените другоеЗаявление «пройти».Ваш скрипт будет работать так, как задумано, помечая каждую из папок уникальным именем фрукта.Проблема возникнет, когда вы запустите скрипт во второй раз.Вы получите ошибку, которую вы видели, но причина будет более очевидной.Ваша логика сравнивает только имя файла с i +1.НЕ против всех возможных пунктов в списке.Таким образом, во время итерации ваш сценарий будет пытаться присвоить файлу имя, которое уже существует, что приведет к ошибке Windows.Ошибка в основном говорит, что я не буду называть это одно и то же.Чтобы это замедлилось (хотя вы могли бы использовать отладчик), я настроил ваш скрипт немного измененным, чтобы вы могли видеть, какие логические условия выполняются и когда.Чтобы использовать этот сценарий, удалите все папки в этом каталоге и создайте новые общие пустые папки Folder1, Folder2 и т. Д. Запустите мой сценарий, и он будет работать в первый раз, как и раньше.Забавьте это во второй раз, и вы увидите ошибку более ясно.

import os
from time import sleep
path = 'path to target directory containing blank files'


files_location = os.listdir(path)
new_entry_name = ['apple', 'orange', 'banana', 'plum', 'strawberry']


i = 0
for folder in files_location:
    print('STARTING LOOP')
    sleep(5)
    print('USING THIS FOLDER: ' + folder)
    print('i IS CURRENTLY SET AT ' + str(i))

    if folder == new_entry_name[i]:
        print('THIS FOLDER MET THE FIRST CONDITIONAL STATEMENT')
        print(new_entry_name[i])
        i += 1

    elif folder != new_entry_name[i]:
        print('FOLDER ' + folder + ' SHOULD BE RENAMED BECAUSE IT DOES NOT MATCH new_entry_name_item' + str(i))
        os.rename(os.path.join(path, folder), os.path.join(path, new_entry_name[i]))
        i += 1
        print('FOLDER RENAMED')
        sleep(10)
    else:
        print('RUN COMPLETE')

Чтобы исправить это, я бы порекомендовал сделать то, что предложил DyZ, и либо проверить имя по всем записям в каталоге или по всем записям в вашем списке.

...