如何在Python中检查路径的存在程度

3
假设在我的文件系统中存在以下目录:
/foo/bar/

在我的Python代码中,我有以下路径:
/foo/bar/baz/quix/

我怎样才能确定路径中只存在 /foo/bar/ 部分?我可以递归地遍历路径,并逐步进行检查,但是否有更简单的方法呢?

你为什么想知道路径的存在范围?如果是为了记录日志,只需要说完整路径不存在即可。 - thiruvenkadam
@thiruvenkadam 我想要跟踪我的代码创建的目录,这样我就可以在之后恢复状态。所以如果foo/已经存在,但是我创建了路径foo/bar/baz,那么我希望能够回到只存在foo/的状态。 - Pavel Penev
那么在创建目录时,您应该保留恢复点,就像这样创建目录,而不是查找先前存在的目录结构。这样会更清洁。例如,如果您在/foo下创建bar目录,最好跟踪/foo/bar已创建,而不是跟踪/foo已经存在。我是否在您的用例中遗漏了什么? - thiruvenkadam
1
很遗憾,os.makedirs不会告诉我它创建了哪些目录,所以我必须自己找出来。 - Pavel Penev
1
os.makedirs 应该只在受控环境中使用。比如你需要在已有的虚拟环境下生成一个目录结构,而这个目录结构肯定不存在。在所有其他情况下,最佳实践是使用 makedir。即使 makedirs 可以减少编写的代码并且看起来很吸引人,但如果你正在操作不同的路径或者不确定路径是否存在,最好的方法是使用 makedir 逐个创建目录以进行恢复。 - thiruvenkadam
4个回答

4
没有在标准库中找到相应的函数,但是自己编写这个函数并不难。下面是一个函数,它接收一个路径并返回存在的路径。
In [129]: def exists(path):
     ...:     if os.path.exists(path): return path
     ...:     return exists(os.path.split(path)[0])
     ...:

In [130]: exists("/home/sevanteri/src/mutta/oisko/siellä/jotain/mitä/ei ole/")
Out[130]: '/home/sevanteri/src'

2
我认为一个简单的while循环和os.path.dirname()函数就可以满足要求。
path_string = '/home/moin/Desktop/my/dummy/path'
while path_string:
    if not os.path.exists(path_string):
        path_string = os.path.dirname(path_string)
    else:
        break
# path_string = '/home/moin/Desktop'  # which is valid path in my system

检查字符串中每个字符的路径并不是一个好主意。甚至可能会得到错误的结果。假设在主文件夹中有“Desktop”和“Desk”,使用您的脚本将得到"/home/moin/Desk" - Sevanteri
@Sevanteri:好吧,这不是我的代码所做的。它将基于每个文件夹进行检查,而不是字符。例如:如果 path_string '/home/moin/Desktop',那么 os.path.split(path_string) 将返回元组 ('/home/moin', 'Desktop')。我认为你把这个“元组”部分和每个字符的迭代混淆了。 - Moinuddin Quadri
@downvoter:请也说明一下为什么要点踩?我讨厌这个匿名的部分。 - Moinuddin Quadri
1
不要使用os.path.split并取[0],最好使用os.path.dirname。dirname就是为了执行这个功能而存在的。 - thiruvenkadam
@thiruvenkadam:是的,你说得对。已更新答案。 - Moinuddin Quadri

1
我其实不确定您的要求是想检查每个路径还是仅检查特定级别。但对于简单的健全性检查,您可以遍历整个路径并创建路径以检查其健全性。
for i in filter(lambda s: s, sample_path.split('/')):
  _path = os.path.join(_path, i)
   if os.path.exists(_path):
      print "correct path"

我想要一个函数,它可以返回已经存在的路径部分,这样我就可以跟踪我创建的目录。是的,我知道我可以做类似于你的代码所做的事情,但我想知道是否已经有一个可以做到这样的函数了。 - Pavel Penev
@Sevanteri 谢谢你提供的信息,我之前不知道 os.sep 这个函数。 - armak
嗯,我已经删除了那个注释... 当处理路径时,你应该使用os.sep进行分割。 - Sevanteri
你可以用 None 替换 lambda 函数,这样也可以过滤掉假值。 - Sevanteri

0

嗯,我认为唯一的方法是递归工作...虽然,我会从目录树向上工作。代码实现起来并不太难:

import os

def doesItExist(directory):
    if not os.path.exists(directory):
        doesItExist(os.path.dirname(directory)
    else:
        print "Found: " + directory
        return directory

如果您从根节点开始迭代而不是检查整个路径,也可以进行迭代 :) - thiruvenkadam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接