防止FileExistsError的函数

时间:2019-02-05 21:16:35

标签: python

我具有防止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循环中,但我不知道如何解决。

3 个答案:

答案 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),但是函数调用返回TrueFalse,这两个都不等于路径字符串。您应该只使用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循环“继续”而不是退出。