我有来自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)
还有更好的方法吗?
答案 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)
如果dirs
和files
生成器几乎同步推进,它允许从服务中使用无限的路径流。
答案 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)