从可能的目录列表中获取文件的平面列表的单行程序?
One-liner to get flat list of files from a list of possible directories?
假设我们有一个目录列表,其中一些可能不存在:
dirs = ['dir1','dir2','dir3']
为了论证,只有两个存在,它们的内容是:
目录 1
--file1a
--file1b
目录 2
--file2a
--file2b
获得所有文件的平坦列表的最佳单行是什么?我得到的最接近的是:
import os
files = [ os.listdir(x) for x in ['dir1','dir','dir3'] if os.path.isdir(x) ]
但这给了我一个嵌套列表:
[['file1a','file1b'],['file2a','file2b']]
如果我希望它成为 ['file1a', 'file1b', 'file2a', 'file2b']
,我必须使用什么单行线来代替?
不确定为什么单线是您想要的,但这里:
files = [path for dir_lst in map(os.listdir, filter(os.path.isdir, ['dir1','dir','dir3'])) for path in dir_lst]
这首先过滤非目录(使用 filter
),然后 map
对剩下的内容进行 os.listdir
,并使用两个 for
循环进行聚合.
您可以将项目链接到一个列表中:
from itertools import chain as ch
files = list(ch.from_iterable(os.listdir(x) for x in ['dir1', 'dir', 'dir3'] if os.path.isdir(x)))
我能做到的最短时间:
from itertools import chain as ch, ifilter as ifil, imap
from os import path, listdir
files = list(ch.from_iterable(imap(listdir, ifil(path.isdir, ('dir1', 'dir', 'dir3')))))
如果您只想使用名称,那么只需遍历链对象即可。
假设我们有一个目录列表,其中一些可能不存在:
dirs = ['dir1','dir2','dir3']
为了论证,只有两个存在,它们的内容是:
目录 1 --file1a --file1b 目录 2 --file2a --file2b
获得所有文件的平坦列表的最佳单行是什么?我得到的最接近的是:
import os
files = [ os.listdir(x) for x in ['dir1','dir','dir3'] if os.path.isdir(x) ]
但这给了我一个嵌套列表:
[['file1a','file1b'],['file2a','file2b']]
如果我希望它成为 ['file1a', 'file1b', 'file2a', 'file2b']
,我必须使用什么单行线来代替?
不确定为什么单线是您想要的,但这里:
files = [path for dir_lst in map(os.listdir, filter(os.path.isdir, ['dir1','dir','dir3'])) for path in dir_lst]
这首先过滤非目录(使用 filter
),然后 map
对剩下的内容进行 os.listdir
,并使用两个 for
循环进行聚合.
您可以将项目链接到一个列表中:
from itertools import chain as ch
files = list(ch.from_iterable(os.listdir(x) for x in ['dir1', 'dir', 'dir3'] if os.path.isdir(x)))
我能做到的最短时间:
from itertools import chain as ch, ifilter as ifil, imap
from os import path, listdir
files = list(ch.from_iterable(imap(listdir, ifil(path.isdir, ('dir1', 'dir', 'dir3')))))
如果您只想使用名称,那么只需遍历链对象即可。