Python - 基于绝对路径读取文件

时间:2018-03-12 06:59:32

标签: python python-3.x file-io

我正在使用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位。

2 个答案:

答案 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.pathpathlib分割路径可能会更清楚:

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,您需要一直拆分到顶级父级,而不是仅拆分一次。但希望(通过文档的一些帮助)你可以从这里弄明白。