我试图在Julia中获取具有新walkdir
功能的文件列表。以下工作,但我希望结果是一个平面的文件列表。这可以通过数组理解来实现,而不是在数组创建后展平它吗?
files = [[joinpath(root, file) for file in files] for (root, dirs, files) in collect(walkdir(AUDIO_PATH))]
答案 0 :(得分:2)
据我所知,这不能通过数组理解来解决,不会在创建数组后展平数组。但是你可以定义一个迭代walkdir的函数:
function files_func(path)
function it()
for (root, dirs, files) in walkdir(path)
for file in files
produce(joinpath(root,file))
end
end
end
Task(it)
end
定义此功能时,可以通过collect(files_func(AUDIO_PATH))
获取文件列表。另外
可以通过将walkdir循环为:
allfiles=ASCIIString[]
for (root, dirs, files) in walkdir(path)
for file in files
push!(allfiles,joinpath(root,file))
end
end
allfiles
答案 1 :(得分:1)
正如@DanielHøegh所指出的,似乎你不能。但您可以使用vcat
函数轻松展平它:
all_files(path::AbstractString) = vcat([[joinpath(root, file) for file in files] for (root, dirs, files) in collect(walkdir(path))]...)
这个更易读的版本就像Daniel的迭代器/生成器一样,但是使用了笛卡儿积for
循环语法,替代@task
宏(只是为了展示它的例子)和紧凑的赋值函数定义语法:
function each_file(path::AbstractString)
iter() = for (root, dirs, files) in walkdir(path), file in files
produce(joinpath(root, file))
end
@task iter()
end
# No need to flatten anything:
all_files(path::AbstractString) = collect(each_file(path))
for file in each_file(AUDIO_PATH)
@show file
end
audio_files = all_files(AUDIO_PATH)
答案 2 :(得分:0)
一个没有理解但可读的选项(对于我的人类神经软件):
filelist = AbstractString[]
for (root, dirs, files) in walkdir(AUDIO_PATH)
append!(filelist,map(_->joinpath(root,_),files))
end
匿名函数和映射可能会产生性能成本,但与可读性相比,它在文件映射代码中的重要性应该较低。