我正在开发一个脚本来重命名给定目录中的文件。
由于编程的迭代性,我希望利用“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'
答案 0 :(得分:1)
好的,这是我解决方案的细分。也许不是最好的解决方案,但我已经尽力保持你的代码。为了有效地提供代码,有许多不同的考虑因素。
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
如果代码没有运行,请告诉我。此外,请随时询问您是否需要我澄清某些内容或帮助您朝着正确的方向前进。
答案 1 :(得分:0)
为了使问题更清楚,请设置以下内容:
创建一个包含五个新文件夹的目录 - 文件夹(1),文件夹(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建议的操作,并根据目录中的所有条目或列表中的所有条目检查名称。