4

我有一个这样的列表:

remote =  ['django', 'django/genelaytics', 'django/genelaytics/manage.py', 'django/genelaytics/rsync/rsync-HEAD-20121003-2147GMT']

我使用 for 循环找到了每个列表的父目录,如下所示:

for i in remote:
    os.path.dirname(i)

我有另一个从用户选择中获得的列表(仅包括文件名),如下所示:

choices = ['django', 'genelaytics', 'manage.py']

要处理这个列表,我需要使用for loop上面提到的我已经拥有的父目录。如何使用这两个列表来获取每个文件的完整路径并处理它们?

django/genelaytics

编辑:列表可能并不总是从顶层层次结构开始。此外,顶层层次结构可能并不总是相同的。这就是为什么我想找出每个文件的完整父目录。例如:

    django
    genelaytics
    .project
    .pydevproject
    manage.py
    fileupload
    __init__.py
    __init__.pyc
    form.html~
    form
    forms.py
    forms.pyc
    models.py
    models.pyc

该列表可能包含 manage.py 和 forms.py。The full path for manage.py may be: django/genelaytics/manage.py and for forms.py django/genelaytics/forms/forms.py. 它实际上是一个树形结构。也是django/genalaytics动态生成的,并且因每个用户而异。所以,它不能是静态的。

4

1 回答 1

5

您可以使用os.path.join和参数扩展来做到这一点:

>>> import os
>>> choices = ['django', 'genelaytics', 'manage.py']
>>> os.path.join(*choices)
'django/genelaytics/manage.py'
>>> os.path.join(*choices[:-1])
'django/genelaytics'

这假设 in 中的元素choices是安全的(即 no ../../manage.py),因为这样的事情可能会发生:

>>> choices = ['django', 'genelaytics', '/etc/passwd']
>>> os.path.join(*choices)
'/etc/passwd'

看起来OP实际上正在寻找:

>>> [os.path.join(*choices[:i + 1]) for i in range(len(choices))]
['django', 'django/genelaytics', 'django/genelaytics/manage.py']

>>> root = '/test/foo/'
>>> [os.path.join(root, *choices[:i + 1]) for i in range(len(choices))]
['/test/foo/django', '/test/foo/django/genelaytics', '/test/foo/django/genelaytics/manage.py']
于 2012-12-10T05:51:11.813 回答