我具有防止FileExistsError
的功能。它会创建一个文件夹,但是如果存在另一个具有相同名称的文件夹,则会在该文件夹的名称后添加一个序列号。
import os
def create_folder(folder_name):
path = '/home/k/Desktop/' + folder_name
folder_number = 1
if os.path.exists(path):
while path == os.path.exists(path):
folder_number += 1
path = '/home/k/Desktop/' + folder_name + ' ({})'.format(folder_number)
os.makedirs(path)
else:
os.makedirs(path)
我能够制作该文件夹,并且如果我创建另一个具有相同名称的文件夹,我会将名称设置为myfoldername(1)
,但是如果再次创建它,它将引发FileExistsError
:< / p>
FileExistsError: [Errno 17] File exists: '/home/k/Desktop/test (1)'
我认为错误出在while
循环中,但我不知道如何解决。
答案 0 :(得分:1)
具有递增编号的新路径名的分配应在while
循环内,以便可以更新path
,并且while
循环的条件仅需要返回布尔值os.path.exists
方法:
while os.path.exists(path):
folder_number += 1
path = '/home/k/Desktop/' + folder_name + ' ({})'.format(folder_number)
答案 1 :(得分:1)
您的代码有两个问题。首先是while
循环的条件没有任何意义。您正在做path == os.path.exists(path)
,但是函数调用返回True
或False
,这两个都不等于路径字符串。您应该只使用os.path.exists(path)
作为条件。
第二个问题是您没有在循环内更新path
。您需要移动更新它的行,以说明增加的文件夹号,这样就不必一遍又一遍地检查相同的path
。
这是我重写该代码的方式:
def create_folder(folder_name):
path = '/home/k/Desktop/' + folder_name
folder_number = 1
while path == os.path.exists(path):
path = '/home/k/Desktop/{} ({})'.format(folder_name, folder_number)
folder_number += 1
os.makedirs(path)
return path
除了引起您当前错误的更改之外,我还进行了其他一些更改。我摆脱了if
语句,这是完全不必要的,因为如果条件while
第一次出错,则os.makedirs
循环将不会运行它的主体。这意味着1
调用是无条件的。除了缩进路径更新行之外,我还重写了它,使其仅使用一种格式化操作,而不是进行一些串联。我还相对于增量步骤对其进行了重新排序,以便您从2
开始编号,而不是return
。最后,我在末尾添加了一个<List className={classes.list} disablePadding>
{fakeData.map((item, i) => <ListItem key={item.MOP+"_" + i} button>....</ListItem>) }
</List>
语句,因为您可能想使用刚创建的文件夹,并且在不返回最终路径的情况下,调用代码将不知道我们必须使用的数字递增到。
答案 2 :(得分:-1)
您遇到的错误是由于存在检查之外folder_number设置为1的结果。每次尝试防止FileExistsError
时,它都会尝试通过创建文件夹名称后附加“(1)”来解决问题。如果已经存在,那么无论如何您都会得到FileExistsError
。
与python中的许多事情一样,有许多不同的方法可以解决此问题。使它仍然类似于函数逻辑的最简单的方法是将while循环与os.path.exists检查结合起来,这样,当已经存在的路径的检查返回True时,while循环会增加数字在括号中。存在检查返回False后,它将执行创建文件夹操作。这是“突如其来”(LBYL)原理的示例:
import os
def create_folder(folder_name):
path = '/home/k/Desktop/' + folder_name
folder_number = 1
while os.path.exists(path):
folder_number += 1
path = '/home/k/Desktop/' + folder_name + ' ({})'.format(folder_number)
os.makedirs(path)
在python中还有一个普遍实现的原则,该原则在这里也可以帮助您,也就是比许可更容易寻求宽恕(EAFP)。基本上,您可以将os.makedirs(path)操作包装在try ..语句之外。
它看起来像这样:
import os
def create_folder(folder_name):
path = '/home/k/Desktop/' + folder_name
folder_number = 0
while os.path.exists(path):
try:
os.makedirs(path)
except FileExistsError:
folder_number += 1
path = '{} ({})'.format(path, folder_number)
continue
如果发生FileExistsError,则修改路径,然后继续语句告诉while循环“继续”而不是退出。