重命名目录中的文件时的 If-Else

If-Else when renaming files in a directory


我正在开发一个脚本来重命名给定目录中的文件。 由于编程的迭代性质,我希望利用 "if-else" 方法来确保可以忽略已经正确标记的文件。

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'

为了使问题更清楚,设置以下内容:

创建一个包含五个新文件夹的目录 - Folder(1)、Folder(2) 等

此外,将您的 else 语句更改为 'pass.' 您的脚本将 运行 按预期为每个文件夹标记一个唯一的水果名称。当您第二次 运行 脚本时,问题就会出现。你会得到你一直看到的错误,但原因会更明显。您的逻辑仅将文件名与 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 的建议进行操作,并根据目录中的所有条目或列表中的所有条目检查名称。

好的,这是我的解决方案细分。也许不是最好的解决方案,但我已尽力忠实于您的代码。为了有效地交付您的代码,有许多不同的考虑因素。

1) 正如我在评论中提到的,该列表提供了有限数量的名称选项,并且还通过将迭代限制在列表的长度来限制您的迭代能力。否则,当您 运行 超出列表中的项目时,您最终会遇到索引错误。当目标目录中的文件夹数大于列表中的项目数时,就会发生此错误。

2) 需要一些动态的方式来为不同的文件夹名称分配唯一的值。大多数时候,如果您担心具有相同的文件名,或者知道它会相同,您会附加一些您知道是独一无二的东西。在这种情况下,一个 date/time 邮票。如你看到的。第一个文件夹将与列表项名称相匹配,然后,当我们再次在 apple 重新启动时,它将进入我们的条件语句以确保它不在目录中,并将附加我们独特的 date/time 标记。

3) 使用 os.path.exists 检查是否存在同名文件夹或文件,这只是另一种查看路径是否存在的方法,return 是否为布尔值。文件操作中出现的好工具

为了遵循这段代码的逻辑,我会创建一个目录,设置五个新文件夹。 运行 这个脚本。您将在目录中看到所有唯一名称。现在将两个新文件夹添加到目录并再次 运行 脚本。你应该得到 apple(date/time) 和 orange(date/time) 以及所有其他原件。

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

如果代码不对,请告诉我 运行。另外,请随时询问您是否需要我澄清一些事情或帮助您朝着正确的方向前进。