【问题标题】:How can I check how much of a path exists in python如何检查python中存在多少路径
【发布时间】:2017-01-22 04:21:14
【问题描述】:

假设在我的文件系统上存在以下目录:

/foo/bar/

在我的 python 代码中,我有以下路径:

/foo/bar/baz/quix/

我怎么知道只有/foo/bar/ 部分路径存在?

我可以递归地走路径,一步一步检查,但是有没有更简单的方法?

【问题讨论】:

  • 你为什么想知道存在什么路径?如果是为了记录目的,说完整路径不存在就足够了。
  • @thiruvenkadam 我想跟踪我的代码创建的目录,以便之后可以恢复状态。因此,如果foo/ 存在,但我创建了路径foo/bar/baz,那么我希望能够恢复到只有foo/ 存在。
  • 那么你应该在创建目录的时候保留恢复点,就像创建这个目录一样,而不是找出之前存在的目录结构。那会更干净。就像您在 /foo 下创建 bar 目录一样,最好跟踪 /foo/bar 的创建,而不是跟踪 /foo 已经存在。我在您的用例中遗漏了什么吗?
  • 好吧,不幸的是os.makedirs 没有告诉我它创建了哪些目录,所以我必须自己弄清楚。
  • os.makedirs 只能在受控环境中使用。就像您需要在绝对不存在的现有 virtualenv 下生成目录结构一样。在所有其他情况下,最佳做法是使用 makedir。尽管 makedirs 减少了编写的代码并且看起来很吸引人,但如果您正在接触不同的路径或不确定现有路径,最好的方法是使用 makedir 一次创建一个目录以进行恢复。

标签: python path directory


【解决方案1】:

标准库中没有简单的功能,但自己制作并不难。

这是一个接受路径并仅返回确实存在的路径的函数。

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】:

    我认为带有os.path.dirname() 的简单while 循环足以满足要求

    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
    

    【讨论】:

    • 检查字符串中每个字符的路径并不是一个好主意。甚至可能以不正确的结果告终。假设主文件夹中有“桌面”和“桌面”。你的脚本最终会得到"/home/moin/Desk"
    • @Sevanteri :那不是我的代码正在做的事情。它将检查每个文件夹,而不是字符。例如:如果path_string '/home/moin/Desktop' 那么os.path.split(path_string) 将返回('/home/moin', 'Desktop') 的元组。我认为您对 tuple 部分与每个字符的迭代感到困惑
    • @downvoter:请同时说明投反对票的原因??我讨厌这个匿名部分
    • 代替os.path.split取[0],使用os.path.dirname会更好。 dirname 只是为了执行此功能。
    • @thiruvenkadam:是的,你是对的。更新了答案
    【解决方案3】:

    我实际上并没有得到您的要求,即您是否希望检查每条路径或达到某个特定级别。但是对于简单的健全性检查,您可以遍历完整路径创建路径并检查健全性。

    for i in filter(lambda s: s, sample_path.split('/')):
      _path = os.path.join(_path, i)
       if os.path.exists(_path):
          print "correct path"
    

    【讨论】:

    • 我想要一个函数来返回已经存在的路径部分,这样我就可以跟踪我创建了哪些目录。是的,我知道我可以做类似于您的代码所做的事情,但我想知道是否有一个函数可以做类似的事情。
    • @Sevanteri 谢谢你不知道os.sep
    • Aaa 并且我已经删除了评论...使用路径时,您应该使用 os.sep 拆分。
    • 你可以用 None 替换 lambda 函数,它也会过滤掉虚假值。
    【解决方案4】:

    嗯,我认为唯一的方法是递归地工作......不过,我会处理目录树。代码实现起来并不难:

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

    【讨论】:

    • 你也可以迭代,如果你从根目录开始而不是检查整个路径:)
    猜你喜欢
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 2020-02-28
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多