Python 如果在重命名目录中的文件时为Else

Python 如果在重命名目录中的文件时为Else,python,if-statement,directory,conditional,rename,Python,If Statement,Directory,Conditional,Rename,我正在开发一个脚本来重命名给定目录中的文件。 由于编程的迭代性质,我希望使用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 =

我正在开发一个脚本来重命名给定目录中的文件。 由于编程的迭代性质,我希望使用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'

要使问题更清楚,请设置以下内容:

创建一个包含五个新文件夹的目录-Folder1、Folder2等

另外,将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需要有一些动态的方法来为不同的文件夹名称分配唯一的值。大多数情况下,如果您担心拥有相同的文件名,或者知道它将是相同的,那么您可以附加一些您知道将是唯一的。在本例中为日期/时间戳。如你所见。第一个文件夹将匹配列表项名称,然后,当我们再次在apple重新启动时,它将点击我们的条件语句以确保它不在目录中,并将附加我们唯一添加的日期/时间戳

3使用os.path.exists检查是否存在同名文件夹或文件这只是查看路径是否存在的另一种方式,将返回布尔值。这是一个在文件操作中出现的有用工具

为了遵循这段代码的逻辑,我将创建一个目录,设置五个新文件夹。运行此脚本。您将在目录中看到所有唯一的名称。现在,将两个新文件夹添加到目录中,然后再次运行脚本。你应该得到appledate/time和orangedate/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

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

您正试图将一个文件重命名为另一个现有文件。考虑打印所有的OS.Posi.CopyPoad,NeXyEngyNyNo[i]并检查它们是否确实存在。嗨,DyZ,听起来我需要在我的脚本中加入一个检查来绕过已经被重命名的文件。您对我该如何做有什么建议吗?请在重命名之前检查os.path.isfileos.path.joinpath,new_entry_name[I]。cjonesrun,谢谢您提供此细分。你完全正确,当我收到这个错误时,它总是第二次运行。您建议如何在我的脚本中执行这样的检查以允许我跳过已重命名的文件夹?随时!是的,我今晚想试一下,写点东西。我的想法是,由于列表的长度是有限的,很明显,你总是会遇到让人筋疲力尽的名字的问题。然而,我将编写一小段代码来解决这个问题。我不会说这是最好的答案,因为有很多有才华的程序员,但它可能会引导你朝着正确的方向前进。我稍后再发。cjonesrun,你把每一步的目的以及它们如何相互沟通都说得很清楚。谢谢你的帮助!随时祝你好运!