【问题标题】:Getting a specific parent folder with Python使用 Python 获取特定的父文件夹
【发布时间】:2011-08-26 07:43:05
【问题描述】:

我已经有了这段正常运行的代码,但是写完之后我确实有一种冲动要尖叫“它还活着,它还活着!”。

我想要做的是将文件夹“modules”作为其父文件夹的文件夹,例如从 /home/user/puppet/modules/impuls-test/templates/apache22/ 我想要 /home/user/puppet/modules/impuls-test/

我想出的是以下内容:

user@server:~/puppet/modules/impuls-test/templates/apache22$ python
Python 2.4.2 (#1, Apr 13 2007, 15:38:32)
[GCC 4.1.0 (SUSE Linux)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> cwd = os.getcwd()
>>> path = cwd
>>> print "cwd: %s" % cwd
cwd: /home/user/puppet/modules/impuls-test/templates/apache22
>>> for i in xrange(len(cwd.split('/'))):
...     (head, tail) = os.path.split(path)
...     print "head: %s" % head
...     print "tail: %s" % tail
...     if tail == 'modules':
...         moduleDir = head + '/modules/' + cwd.split('/')[i+2] + '/'
...         print "moduleDir: %s" % moduleDir
...         break
...     else:
...         path = head
...
head: /home/user/puppet/modules/impuls-test/templates
tail: apache22
head: /home/user/puppet/modules/impuls-test
tail: templates
head: /home/user/puppet/modules
tail: impuls-test
head: /home/user/puppet
tail: modules
moduleDir: /home/user/puppet/modules/impuls-test/

我得到当前工作目录并使用os.path.split 这么久,直到它到达模块文件夹。使用普通的string.split 函数遍历 cwd,然后我可以将原始 cwd.split('/') 数组中的 moduleDir 附加到当前头部。

有人能告诉我一个更好的/pythonic的方法吗? 当然我可以检查当前头部是否以模块结尾,然后附加当前尾部,但这只会使循环更快地中断并且仍然很难看。

【问题讨论】:

    标签: python path directory


    【解决方案1】:

    由于 os.path.normpath 处理“..”运算符,您可以添加一个“..”并让 normpath 完成工作:

    >>> path = "/home/user/puppet/modules/impuls-test/templates"
    >>> os.path.normpath(os.path.join(path, ".."))
    '/home/user/puppet/modules/impuls-test'
    

    【讨论】:

    • 问题不在于获得规范化或 Windows 友好的路径,而是为了找出许多文件夹,我不得不返回到模块目录。
    • xorpaul:啊,抱歉,我没有仔细阅读这个问题。
    • 不知道这是否对 OP 有帮助,但知道我可以使用 normpath 应用“..”对我有很大帮助! +1
    【解决方案2】:
    path = "/home/user/puppet/modules/impuls-test/templates"
    components = path.split(os.sep)
    print str.join(os.sep, components[:components.index("modules")+2])
    

    打印

    /home/user/puppet/modules/impuls-test
    

    【讨论】:

    • 请注意,此解决方案(类似于 OP)是特定于操作系统的。通过文本“/”分割路径在 Windows 上不起作用
    • @Eli:我的第一次尝试是使用os.path.pathsep,结果是错误的,所以我只使用了/。现在我花时间查找正确的名称。
    • ++。顺便说一句,它也可以通过 os.sep 获得
    • 感谢这个优雅的解决方案,我很高兴用这个来代替我的憎恶。
    • 在任何路径操作之前调用normpath()(偶尔也调用normcase())总是明智的。例如,在 Windows 上,这会将正斜杠 (os.altsep) 转换为反斜杠 (os.sep)。它还将删除重复的路径分隔符和点目录,这通常是一件好事。
    【解决方案3】:

    类似于Sven's (original) answer,但更便携且具有错误处理功能...

    >>> import os
    >>> cwd = '/home/user/puppet/modules/impuls-test/templates/apache22'
    >>> directories = cwd.split(os.sep)
    >>> try:
    ...     modules_depth = directories.index('modules')
    ...     print(os.sep.join(directories[:modules_depth + 2]))
    ... except ValueError:
    ...     print('Could not find "modules"')
    ... 
    /home/user/puppet/modules/impuls-test
    

    【讨论】:

      【解决方案4】:

      你可以使用正则表达式

      >>> import re
      >>> print re.findall(r'(/.*?/modules/(.*?)/).*','/hello/modules/foo/bye')[0]
      ('/hello/modules/foo/', 'foo')
      

      【讨论】:

        猜你喜欢
        • 2020-10-31
        • 1970-01-01
        • 2016-03-05
        • 2019-09-07
        • 2021-04-03
        • 2016-02-16
        • 1970-01-01
        • 2021-09-15
        • 1970-01-01
        相关资源
        最近更新 更多