我正在使用Python 3.xx处理多个音频文件。我列出了所有文件' txt文件中的绝对路径。有4种乐器类型,Brass,String,Percussion和Woodwind。文件的文件夹结构如下所示:
F:\Brass\Bass Trombone\BassTrombone.ff.stereo\BassTrombone.ff.A1.stereo.aif
.
.
F:\Percussion\Vibraphone\Vibraphone.shortsustain.ff.stereo\Vibraphone.shortsustain.ff.C4.stereo.aif
.
.
F:\String\Viola\Viola.arco.ff.sulC.stereo\Viola.arco.ff.sulC.F4.stereo.aif
.
.
F:\Woodwind\Bassoon\Bassoon.ff.stereo\Bassoon.ff.Eb3.stereo.aif
我想基于其绝对路径处理文件,有点像这样:
if(filepath=='F:\Brass\*.aif'):
#process Brass type audio file
elif(filepath=='F:\Percussion\*.aif'):
#process Percussion type audio file
elif(filepath=='F:\String\*.aif'):
#process String type audio file
elif(filepath=='F:\Woodwind\*.aif'):
#process Woodwind type audio file
我的问题是如何使用Python 3.xx做到这一点?我正在使用OS Windows 10 64位。
答案 0 :(得分:0)
对于您描述的用例,最简单的方法可能是startswith()
方法:
if(filepath.startswith(r'F:\Brass)')
#do something
或者,您可以在路径中查找某些关键字:
if('Brass' in filepath)
#do something
答案 1 :(得分:0)
您可以使用fnmatch
模块匹配'F:\Brass\*.aif'
之类的“glob模式”:
if fnmatch(filepath, r'F:\Brass\*.aif'):
但是,使用os.path
或pathlib
分割路径可能会更清楚:
dname, fname = os.path.split(filepath)
name, ext = os.path.splitext(name)
if dname == r'F:\Brass' and ext == '.aif':
# do stuff with filepath, or whichever part you split off
这也意味着您可以将if
/ elif
替换为在dict中查找函数或类型的代码:
kinds = {
r'F:\Brass': handle_brass,
r'F:\Percussion': handle_percussion,
# etc.
}
dname, fname = os.path.split(filepath)
name, ext = os.path.splitext(name)
if dname in kinds and ext == '.aif':
kinds[dname](filepath)
尽管如此,查看您的示例,这两个版本都不会与F:\Brass\Bass Trombone\BassTrombone.ff.stereo\BassTrombone.ff.A1.stereo.aif
匹配。对于glob模式,*.aif
仅匹配该目录中的文件,而不匹配该目录的任何子目录;你需要一个双星递归glob。对于os.path.split
,您需要一直拆分到顶级父级,而不是仅拆分一次。但希望(通过文档的一些帮助)你可以从这里弄明白。