Python在目录中创建不需要的文件夹

时间:2010-02-03 11:10:26

标签: python file-access

每次调用此方法时,Python都会在我的目录中创建一个文件夹。该方法位于我的一个Django应用程序中,需要访问服务器的本地区域。

def filepath(filename, foldername='', envar='MYAPPDIR'):

    if envar is not None and envar is os.environ:
        dirpath = os.environ[envar]
    else:
        dirpath = '~/myFolder/%s' % foldername    

    expanded = os.path.expanduser(dirpath)
    if not os.path.isdir(expanded):
        if os.path.lexists(expanded):
            raise IOError(errno.EEXIST, "Path is a file, nor a dir", expanded)
        os.makedirs(expanded)

    return os.path.join(expanded, filename)

我想阻止它发生。

请注意:用户可以指定它是否在默认的另一个目录中。因此,默认文件夹为myFolder,但是如果用户想要在myOtherFolder中使用名为myFolder的文件夹(因此~/myFolder/myOtherFolder/),则可以使用folder=''。这是我正在尝试实现的功能,因此如果没有参数传递给方法我会使用{{1}}(我认为这是问题)。

2 个答案:

答案 0 :(得分:3)

def filepath(filename, foldername=None, envar='MYAPPDIR'):
  default = '~/myFolder'
  if foldername:
    default = os.path.join(default, foldername)
  dirpath = os.path.expanduser(os.environ.get(envar, default))

  try:
    os.makedirs(dirpath)
  except OSError as e:
    if e.errno != errno.EEXIST:
      raise
  return os.path.join(dirpath, filename)

最大的变化是删除你在第一个if条件下的“是”拼写错误(你的意思是“in”?)。

然而,看起来你想要envar覆盖“〜/ myFolder”,而不是“〜/ myFolder / otherSpecifiedByUser”,给出:

def filepath(filename, foldername=None, envar='MYAPPDIR'):
  dirpath = os.path.expanduser(os.environ.get(envar, "~/myFolder"))
  if foldername:
    dirpath = os.path.join(dirpath, foldername)

  try:
    os.makedirs(dirpath)
  except OSError as e:
    if e.errno != errno.EEXIST:
      raise
  return os.path.join(dirpath, filename)

此外,如果您正在存储配置文件,那么如果您真的使用“〜/ .myFolder”之类的东西,那么您可以轻松地关注XDG basedir spec

def filepath(filename, foldername=None, envar='MYAPPDIR'):
  default = os.path.join(os.environ.get("XDG_CONFIG_HOME", "~/.config"), "myFolder")
  dirpath = os.path.expanduser(os.environ.get(envar, default))
  if foldername:
    dirpath = os.path.join(dirpath, foldername)

  try:
    os.makedirs(dirpath)
  except OSError as e:
    if e.errno != errno.EEXIST:
      raise
  return os.path.join(dirpath, filename)

答案 1 :(得分:0)

我想它会进入你的初始if子句的第二部分。在环境中运行时,可以打印出envar的值和os.environ中的键吗?那应该给你答案。此外,您意识到os.environ是服务器运行的环境,并且不依赖于客户端的任何内容,不是吗?