仅匹配子目录中的文件 - python

时间:2013-11-02 17:14:09

标签: python subdirectory os.walk

我有一个像这样的文件夹系统:

    • Mixtape 1
      • 的MP3
      • 子DIR /
        • 的MP3
    • Mixtape 2
      • 的MP3
      • 子DIR /
        • 的MP3
    • Mixtape 3
      • 的MP3
      • 子DIR /
        • 的MP3

我正在寻找所有mp3文件的列表(仅来自sub-dir),然后从该列表中播放随机mp3。

所以,我想出了以下代码:

import os
import random
import subprocess

# Set the root dir for mixtapes
rootDir = 'mixtapes'

# Function to make a list of mp3 files
def fileList(rootDir):
    matches = []
    for mixtape, subdir, mp3s in os.walk(rootDir):
        for mp3 in mp3s:
            if mp3.endswith(('.mp3', '.m4a')):
                matches.append(os.path.join(mixtape, mp3))
    return matches

# Select one of the mp3 files from the list at random
file = random.choice(fileList(rootDir))

print file

# Play the file
subprocess.call(["afplay", file])

但是,此代码以递归方式提取所有.mp3或.m4a文件...如果它们包含在“sub-dir”中,我只需要它们。

那么,我如何修改fileList函数,只有在子目录内才附加mp3?

2 个答案:

答案 0 :(得分:0)

为什么不明显?检查一下:

类似的东西(没有检查确切的synatx)

for mixtape, subdir, mp3s in os.walk(rootDir):


    for mp3 in mp3s:
        if os.path.dirname(os.path.join(mixtape, mp3)) == rootDir:
        continue

答案 1 :(得分:0)

一种可能的解决方案是对fileList()进行以下修改:

def fileList(rootDir):
    matches = []
    for d1 in next(os.walk(rootDir))[1]:
        for d2 in next( os.walk(os.path.join(rootDir, d1)) )[1]:
            for mixtape, subdir, mp3s in os.walk(os.path.join(rootDir, d1, d2)):
                for mp3 in mp3s:
                    if mp3.endswith(('.mp3', '.m4a')):
                        matches.append(os.path.join(mixtape, mp3))
    return matches

澄清一下,这个成语:

next(os.walk(some_dir))[1]

...返回some_dir中的子目录名称列表。

换句话说,上面的代码首先在搜索mp3之前将两个级别深入到文件夹heirarchy中。

另外,如果你在每个“sub-dir”文件夹中没有任何子文件夹,那么你可以在函数中的那一点使用os.listdir()而不是os.walk(),因为没有进一步的子文件夹遍历。