1

我有来自 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)

有没有更好的方法?

4

3 回答 3

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
于 2013-06-25T09:43:22.360 回答
2

将列表过滤成两部分,一个可迭代的版本:

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)

dirs如果两者和files生成器几乎同步推进,它允许从服务中消耗无限的路径流。

于 2013-06-25T11:09:09.260 回答
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)
于 2013-06-25T09:50:59.957 回答