什么最好区分字符串中的文件和目录路径

时间:2013-06-25 09:41:39

标签: python regex

我有来自Amazon S3 API服务的字符串列表,其中包含完整的文件路径,如下所示:

fileA.jpg
fileB.jpg
images/

我想将分区文件夹和文件放入不同的列表中。

我怎么能分开它们?

我在想这样的正则表达式:

for path in list:
    if re.search("/$",path)
        dir_list.append(path)
    else
        file_list.append(path)

还有更好的方法吗?

3 个答案:

答案 0 :(得分:7)

不要使用正则表达式;只需使用.endswith('/')

for path in lst:
    if path.endswith('/'):
        dir_list.append(path)
    else:
        file_list.append(path)

.endswith()比正则表达式表现更好,并且更容易启动:

>>> sample = ['fileA.jpg', 'fileB.jpg', 'images/'] * 30
>>> import random
>>> random.shuffle(sample)
>>> from timeit import timeit
>>> import re
>>> def re_partition(pattern=re.compile(r'/$')):
...     for e in sample:
...         if pattern.search(e): pass
...         else: pass
... 
>>> def endswith_partition():
...     for e in sample:
...         if e.endswith('/'): pass
...         else: pass
... 
>>> timeit('f()', 'from __main__ import re_partition as f, sample', number=10000)
0.2553541660308838
>>> timeit('f()', 'from __main__ import endswith_partition as f, sample', number=10000)
0.20675897598266602

答案 1 :(得分:2)

来自Filter a list into two parts,一个可迭代的版本:

from itertools import tee

a, b = tee((p.endswith("/"), p) for p in paths)
dirs = (path for isdir, path in a if isdir)
files = (path for isdir, path in b if not isdir)

如果dirsfiles生成器几乎同步推进,它允许从服务中使用无限的路径流。

答案 2 :(得分:0)

您可以使用itertools模块进行项目分组:

import itertools

items = ["fileA.jpg","fileB.jpg","images/"]
sorter = lambda x:x.endswith("/")
items = sorted(items, key=sorter) #in case items are not sorted
files, dirs = [tuple(i[1]) for i in itertools.groupby(items, sorter)]

print(files, dirs)