【问题标题】:If-Else when renaming files in a directory重命名目录中的文件时的 If-Else
【发布时间】:2018-11-01 17:41:34
【问题描述】:


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

【问题讨论】:

  • 您正试图将一个文件重命名为另一个现有文件。考虑打印所有os.path.join(path,new_entry_name[i]) 并检查它们是否确实存在。
  • 嗨 DyZ,听起来我需要在我的脚本中加入一个检查来绕过已经重命名的文件。您对我如何做到这一点有什么建议吗?
  • 重命名前检查if os.path.isfile(os.path.join(path,new_entry_name[i]))

标签: python if-statement directory conditional rename


【解决方案1】:

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

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

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

【讨论】:

  • cjonesrun,感谢您提供此细分。你是对的,当我收到这个错误时,它总是第二次运行。您如何建议在我的脚本中执行这样的检查以允许我“跳过”已经重命名的文件夹?
  • 随时!是的,我今晚打算试一试,然后写点什么。我的想法是,由于列表的长度是有限的,显然你总是会遇到用尽名称的问题。但是,我会写一小段代码来解决这个问题。我不会说这将是最好的答案,因为有很多才华横溢的编码人员,但它可能会引导你朝着正确的方向前进。我稍后再发。
【解决方案2】:

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

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

2) 需要有某种动态方式为不同的文件夹名称分配唯一值。大多数情况下,如果您担心文件名相同,或者知道文件名相同,您会附加一些您知道将是独一无二的内容。在这种情况下,日期/时间戳。如你看到的。第一个文件夹将匹配列表项名称,然后,当我们再次在 Apple 重新启动时,它将进入我们的条件语句以确保它不在目录中,并将附加我们唯一添加的日期/时间戳。

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

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

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

【讨论】:

  • cjonesrun,您将每个步骤的目的以及它们如何相互沟通都非常清楚。感谢您的帮助!
  • 随时!祝你事业顺利!
猜你喜欢
  • 2015-10-08
  • 2020-08-30
  • 2013-06-12
  • 2018-02-25
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 2019-07-07
  • 2014-05-16
相关资源
最近更新 更多